Доктрина запрашивает отдельную связанную сущность
Я, наверное, упускаю из виду что-то очень простое и просто слишком много на это смотрю, но я не могу заставить этот 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
Можете ли вы сказать мне, что мне здесь не хватает?
6 ответов
Я обошел проблему, выполнив выборку:
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
)
Так как это первое совпадение 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
Мне нужно было указать полные пространства имен и классы для обеих сущностей.
Вам нужно выбрать ОТ root entity alias
.. означает, что вы не можете ВЫБРАТЬ только из таблицы, к которой вы присоединяетесь, как вы можете в простом sql.. поэтому что-то вроде этого должно сделать это:
SELECT DISTINCT g
FROM Entity\Group g
INNER JOIN g.user u
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
Вы можете сделать это с помощью нового ключевого слова WITH в DQL:
SELECT DISTINCT g
FROM Entity\User u
LEFT JOIN Entity\Group g
WITH u in g.users
WHERE u.active = :active
Я использую это
$qb = $this->createQueryBuilder('o')
->select('DISTINCT IDENTITY(o.user)')