2012-04-18 18 views
8

Prawdopodobnie przeoczyłem coś bardzo prostego i po prostu wpatrywałem się w to za dużo, ale nie mogę uzyskać tej kwerendy DQL do pracy. Otrzymuję wyjątek stwierdzający:Doctrine zapytanie odrębna jednostka pokrewna

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

Oto moje zapytanie. Użytkownik ma relację wiele do jednego z Grupą. Zauważ, że jest to relacja jednokierunkowa! To może nie mieć dla ciebie sensu, ale ma sens w naszej logice domeny.

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

Czy możesz mi powiedzieć, czego tu brakuje?

+0

Czy po LEFT JOIN nie brakuje "ON"? –

+3

Nie. To jest Doctrine DQL, a nie SQL. –

Odpowiedz

5

pracowałem wokół problemu wykonując podselekcji:

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

Ach, to ma sens. Wydaje mi się, że pamiętam, że kiedyś w to wbiegałem. Kindof irytujące obejście. –

6

Musisz wybrać z root entity alias .. co oznacza, że ​​nie można wybrać tylko z tabeli łączącej jesteś na, jak można w zwykły SQL .. więc coś takiego powinien zrobić:

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

Ups, błąd transkrypcji z mojej strony. Przepraszam. Moje rzeczywiste byty są nazywane inaczej, chociaż ich relacja (i reszta DQL) jest taka sama. –

+0

Ah, w tym przypadku narzeka, że ​​wyszukujesz od użytkowników, ale nie wliczasz Podmiotu Użytkownika w część SELECT twojego zapytania, stąd "alias z co najmniej jednego root'a" w twoim ostrzeżeniu - alias nazwy użytkownika root oznacza po prostu * what's w twojej klauzuli FROM *, dla wszystkich intensywnych celów. Zaktualizowałem moją odpowiedź. –

+0

I to jest dokładny problem. Mój model domeny mówi, że relacja jest jednokierunkowa, więc nie mogę zapytać z drugiej strony, tak jak tu robisz. Pracowałem nad tym, wykonując podselekcję. –

15

Ponieważ jest to pierwszy mecz Google, szukając komunikatu o błędzie „nie można wybrać jednostkę poprzez ...”, Postanowiłem odpowiedzieć pomimo tego, że temat został opublikowany kilka miesięcy temu.

Sztuką jest użycie JOIN ... WITH ... (jak JOIN ... ON ... w SQL).

Miałem wiadomość z tym kodem:

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

I rozwiązać problem przez ten kod:

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 

Musiałem podać pełnych nazw i klas dla obu podmiotów.

2

Można to zrobić za pomocą DQL nowego Z słowa kluczowego:

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

miałem podobny problem i rozwiązać go przez wielu z linii tak:

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

Hennes

0

Używam tego

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

Pytasz nie o jednostkę w całości, ale tylko o jej tożsamość. –