Doctrine 2 WHERE IN, используя набор объектов

Я пытаюсь построить запрос в 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 Запрос с использованием коллекции в качестве параметра

http://doctrine-orm.readthedocs.org/en/latest/changelog/migration_2_5.html#query-api-where-in-query-using-a-collection-as-parameter