2012-04-18 2 views
8

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

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 

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

+0

Не пропустил 'ON' здесь после LEFT JOIN? –

+3

Нет. Это Doctrine DQL, а не SQL. –

ответ

5

Я работал вокруг проблемы, делая подзапрос:

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 
) 
+0

А, это имеет смысл. Кажется, я помню, как однажды это случилось. Вид на раздражающее обходное решение. –

6

Вы должны выбрать ИЗ root entity alias .. означает, что вы не можете выбрать только из таблицы, которую вы присоединяете на, как вы можете в простой SQL .. так что-то вроде этого следует сделать это:

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

Упс, ошибка транскрипции с моей стороны. Мои извинения. Мои фактические объекты называются по-разному, хотя их отношение (и остальная часть DQL) одинаково. –

+0

Ах, в этом случае он жалуется на то, что вы запрашиваете FROM Users, но не включая Entity Users в части SELECT вашего запроса, следовательно, «как минимум один псевдоним корня сущности» в вашем предупреждении - псевдоним корня сущности означает только то, что в вашем разделе FROM *, для всех интенсивных целей. Я обновил свой ответ –

+0

И это точная проблема. Моя модель домена говорит, что отношения однонаправлены, поэтому я не могу запрашивать с другой стороны, как вы здесь делаете. Я работал над этим, выполнив подзапрос. –

15

Поскольку это первый матч 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 

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

2

Вы можете сделать это с помощью DQL Новинки С ключевое слово:

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

У меня была аналогичная проблема, и решить ее с помощью нескольких из линий, как это:

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

Hennes

0

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

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

Вы запрашиваете не сущность в целом, а только ее личность. –

Смежные вопросы