2012-04-18 11 views
8

Ich habe wahrscheinlich etwas sehr einfaches übersehen und habe es nur zu sehr angeguckt, aber ich kann diese DQL-Abfrage nicht funktionieren. Ich bekomme eine Ausnahme mit:Doktrinabfrage distinct related entity

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

Hier ist meine Abfrage. Der Benutzer hat eine Viele-zu-Eins-Beziehung zur Gruppe. Beachten Sie, dass dies eine unidirektionale Beziehung ist! Das mag für Sie keinen Sinn ergeben, macht aber in unserer Domänenlogik Sinn.

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

Können Sie mir sagen, was ich hier vermisse?

+0

fehlt hier nicht ein 'ON' nach dem LINKEN JOIN? –

+3

Nein. Dies ist Doctrine DQL, nicht SQL. –

Antwort

5

ich, um das Problem gearbeitet, indem ein subselect tun:

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

Ah, das macht Sinn. Ich kann mich daran erinnern, dass ich einmal darauf gestoßen bin. Eine Art nerviger Workaround. –

6

Sie müssen aus der root entity alias auszuwählen .. das heißt, Sie nicht nur aus einer Tabelle auswählen, können Sie auf den Sie betreten, wie Sie können in einfachen SQL .. so etwas wie dies sollte es tun:

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

Hoppla, ein Übertragungsfehler meinerseits. Entschuldigen Sie. Meine tatsächlichen Entitäten werden anders benannt, obwohl ihre Beziehung (und der Rest der DQL) gleich ist. –

+0

Ah, in diesem Fall beschwert es sich, dass Sie FROM-Benutzer abfragen, aber nicht die Benutzer-Entität im SELECT-Teil Ihrer Abfrage, daher bedeutet der mindestens eine Root-Entity-Alias ​​in Ihrer Warnung - root-Entity-Alias ​​nur * was ist in Ihrer FROM-Klausel *, für alle intensiven Zwecke .. Ich habe meine Antwort aktualisiert –

+0

Und das ist das genaue Problem. Mein Domänenmodell sagt, dass die Beziehung unidirektional ist, so dass ich nicht von der anderen Seite abfragen kann, als ob Sie hier arbeiten. Ich habe mit einem Subselect daran gearbeitet. –

15

Da dies das erste Google-Spiel ist, wenn für die Fehlermeldung Suche „Can not Einheit durch wählen ...“, entschied ich mich zu antworten, obwohl das Thema vor ein paar Monaten gepostet wurde.

Der Trick besteht darin, JOIN ... MIT ... zu verwenden (wie JOIN ... ON ... in SQL).

Ich habe die Nachricht mit diesem Code:

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

ich das Problem durch diesen Code gelöst:

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 

ich voll Namespaces und Klassen für beiden Entitäten angeben benötigt.

2

Sie können dies DQL Der neue MIT Schlüsselwort:

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

hatte ich ein ähnliches Problem und löste es durch mehrere von Zeilen wie diese:

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

Hennes

0

Ich benutze diese

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

Sie fragen nicht eine Entität in einem Ganzen ab, sondern nur ihre Identität. –

Verwandte Themen