Доктрина запрашивает отдельную связанную сущность

Я, наверное, упускаю из виду что-то очень простое и просто слишком много на это смотрю, но я не могу заставить этот 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)')
Другие вопросы по тегам