2012-04-18 19 views
8

Probabilmente sto trascurando qualcosa di molto semplice e l'ho appena guardato troppo, ma non riesco a far funzionare questa query DQL. Ricevo un'eccezione affermando:Entità correlata alla query di Doctrine

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

Ecco la mia richiesta. L'utente ha una relazione molti-a-uno con il Gruppo. Si noti che questa è una relazione unidirezionale! Questo potrebbe non avere senso per te, ma ha senso nella nostra logica di dominio.

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

Puoi dirmi cosa mi manca qui?

+0

Non manca un 'ON' qui dopo il LEFT JOIN? –

+3

No. Questo è Doctrine DQL, non SQL. –

risposta

5

ho lavorato tutto il problema facendo un subselect:

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, questo ha senso. Mi sembra di ricordare di averlo incontrato una volta. Kindof una soluzione fastidiosa. –

6

È necessario selezionare dal root entity alias .. significa che non è possibile selezionare solo da una tabella che si sta unendo in poi, come si può in SQL pianura .. quindi qualcosa di simile dovrebbe farlo:

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

Oops, un errore di trascrizione da parte mia. Mie scuse. Le mie entità attuali sono nominate diversamente, sebbene la loro relazione (e il resto del DQL) sia la stessa. –

+0

Ah, in questo caso, si lamenta che stai interrogando DA Utenti, ma non includendo l'Entità Utente nella parte SELECT della tua query, quindi "almeno un alias entità root" nel tuo avviso - alias entità radice significa semplicemente * qual è nella tua clausola FROM *, per tutti gli scopi intensivi. Ho aggiornato la mia risposta –

+0

E questo è esattamente il problema. Il mio modello di dominio dice che la relazione è unidirezionale, quindi non posso eseguire query dall'altra parte come fai qui. Ci ho lavorato intorno facendo una sottoselezione. –

15

Poiché questa è la prima partita di Google durante la ricerca per il messaggio di errore "non è possibile selezionare entità attraverso ...", ho deciso di rispondere nonostante l'argomento fosse pubblicato pochi mesi fa.

Il trucco è utilizzare JOIN ... WITH ... (come JOIN ... ON ... in SQL).

stavo avendo il messaggio con questo codice:

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

ho risolto il problema da questo codice:

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 

avevo bisogno di specificare gli spazi dei nomi completi e le classi per entrambe le entità.

2

È possibile farlo usando DQL di nuovo CON parola chiave:

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

Ho avuto un problema simile e risolto da più da linee come questa:

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

Hennes

0

Io uso questo

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

Stai interrogando non un'entità in un tutto, ma solo la sua identità. –

Problemi correlati