Я пытаюсь построить запрос в Doctrine 2, который находит все объекты Vacancy
которые связаны с любым из данных объектов VacancyWorkingHours
.
Объект « Vacancy
выглядит следующим образом:
/** * Vacancy * * @ORM\Table(name="vacancy") * @ORM\Entity(repositoryClass="JaikDean\CareersBundle\Entity\VacancyRepository") */ class Vacancy { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var VacancyWorkingHours * * @ORM\ManyToOne(targetEntity="VacancyWorkingHours", inversedBy="vacancies") * @ORM\JoinColumn(name="vacancy_working_hours_id", referencedColumnName="id") **/ private $workingHours; /* Other fields and methods are inconsequential */ }
Мой запрос в настоящее время выглядит следующим образом, но не возвращает результатов из-за предложения where. В этом примере $workingHours
является $workingHours
Doctrine\Common\Collections\ArrayCollection
содержащим ряд объектов VacancyWorkingHours
$q = $this->createQueryBuilder('v') ->select('v') ->andWhere('v.workingHours IN (:workingHours)') ->setParameter('workingHours', $workingHours->toArray()); ;
Запрос на растяжение, который я сделал об этом, был объединен с Doctrine ORM 2.5, поэтому вы можете просто сделать это сейчас:
$q = $this->createQueryBuilder('v') ->select('v') ->andWhere('v.workingHours IN (:workingHours)') ->setParameter('workingHours', $workingHours); ;
Последняя версия Doctrine теперь позволяет вводить параметры сбора и автоматически использует первичный ключ каждой записи коллекции.
Попробуйте установить идентификаторы в качестве параметра
$ids = array(); foreach($workingHours as $w) { $ids[] = $w->getId(); }
затем
$q = $this->createQueryBuilder('v') ->select('v') ->andWhere('v.workingHours IN (:workingHours)') ->setParameter('workingHours', $ids); ;
Я думаю, что DQL будет работать лучше для этого.
$em = $this->getDoctrine()->getEntityManager(); $query = $em->createQuery( 'SELECT v FROM YourAppYourBundle:YourEntity v // exemple AcmeexampleBundle:YourEntity WHERE v.workingHours IN :workingHours' )->setParameter('workingHours', $workingHours->toArray()); $vacancies = $query->getResult();
new в Doctrine 2.5 – WHERE IN Запрос с использованием коллекции в качестве параметра