Doctrine запрашивает отдельный связанный объект

Я, вероятно, пропущу что-то очень простое и просто слишком уставился на него, но я не могу заставить этот DQL-запрос работать. Я получаю исключение:

Cannot select entity through identification variables without choosing at least one root entity alias. 

Вот мой запрос. Пользователь имеет много-к-одному отношение к Группе. Обратите внимание, что это однонаправленное отношение! Это может не иметь никакого смысла для вас, но это имеет смысл в нашей логике домена.

 SELECT DISTINCT g FROM Entity\User u LEFT JOIN u.group g WHERE u.active = :active 

Можете ли вы рассказать мне, что мне здесь не хватает?

Поскольку это первое совпадение с Google при поиске сообщения об ошибке «Невозможно выбрать объект через …» , я решил ответить, несмотря на то, что тема была опубликована несколько месяцев назад.

Трюк состоит в том, чтобы использовать JOIN … WITH … (например, JOIN … ON … в SQL).

У меня было сообщение с этим кодом:

 SELECT ro, COUNT(ro) FROM FH\MailerBundle\Entity\Recipient r JOIN r.selectedOption ro GROUP BY ro.id 

Я решил проблему с помощью этого кода:

 SELECT ro, COUNT(ro) FROM FH\MailerBundle\Entity\RecipientOption AS ro JOIN FH\MailerBundle\Entity\Recipient AS r WITH r.selectedOption = ro GROUP BY ro.id 

Мне нужно было указать полные пространства имен и классы для обоих объектов.

Вам нужно выбрать FROM из root entity alias . Это означает, что вы не можете выбрать SELECT только из таблицы, в которую вы входите, как вы можете в обычном sql .. так что-то вроде этого должно это сделать:

 SELECT DISTINCT g FROM Entity\Group g INNER JOIN g.user u WHERE u.active = :active 

Я работал над проблемой, выполнив подзаголовок:

 SELECT g FROM Entity\Group WHERE g.id IN ( SELECT DISTINCT g2.id FROM Entity\User u LEFT JOIN u.group g2 WHERE u.active = :active ) 

Вы можете сделать это, используя новое ключевое слово WITH DQL:

 SELECT DISTINCT g FROM Entity\User u LEFT JOIN Entity\Group g WITH u in g.users WHERE u.active = :active 

У меня была аналогичная проблема, и я решил ее несколькими способами:

 $this->getDoctrine()->createQueryBuilder() ->from('ProjectMainBundle:Group', 'g') ->from('ProjectMainBundle:User', 'u') ->select('distinct(g)') ->where('u.group = g') ->andWhere('u.active = :active') ->.... 

Hennes

Я использую это

 $qb = $this->createQueryBuilder('o') ->select('DISTINCT IDENTITY(o.user)')