2016-11-08 4 views
0

Возможно ли в Доктрине использовать инструкцию IN и передать список сущностей в качестве параметра для инструкции IN?Doctrine DQL, используя инструкцию IN с объектами

Например, со следующим соотношением:

/** 
* @var \Doctrine\Common\Collections\Collection 
* 
* @ORM\OneToMany(targetEntity="Calendar", mappedBy="education", cascade={"persist"}) 
*/ 
private $calendar; 

Я хотел бы сделать запрос как:

SELECT p FROM Education p WHERE p.calendar IN (:calendar) 

: календарь параметру массив объектов.

$query->setParameter('calendar', array($singleEntity,$singleEntity2)); 

Но это дает следующее сообщение об ошибке:

near 'calendar IN (:calendar)': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField 
+0

Для DQL (не DML?) Вам нужно будет присоединиться к календарю: SELECT education FROM EducationClassName education LEFT JOIN education.calendar calendar WHERE calendar.id IN (: calendarIds) Я всегда использовал идентификаторы для операторов IN, поэтому я знаю, что они но вы можете попробовать использовать полный объект без .id и посмотреть, что произойдет. – Cerad

+0

@Cerad Обновлен DML для DQL. – Laurence

+0

@Cerad Это именно обходной путь, который я использовал. – Laurence

ответ

0

Вы можете использовать полные объекты для утверждения IN и DQL будет как

$query->select('p') 
    ->from('Education', 'p') 
    ->where($query->expr()->in('p.calendar', ':values')) 
    ->setParameter('values', array($singleEntity,$singleEntity2)); 

Я использовал это раньше довольно много раз, если я правильно помню и всегда работал. Обычно я использую JOIN и атрибут, предложенный Cerad, но это тоже должно работать.