2012-04-18 26 views
5

Ho un problema con Doctrine 2 e un join sinistro in una relazione di maggio che sto cercando di ottenere. Probabilmente è il mio costruttore di Query, ma non riesco a capirlo.Doctrine 2 leftJoin, with, manytomany relationship, errato numero di righe restituite

Ho una tabella unirsi in questo modo:

---------------------------------- 
| user_id | attraction_id | 
---------------------------------- 
| 4    1    | 
| 4    2    | 
| 4    3    | 
---------------------------------- 

Per due modelli, l'utente e di attrazione, dove utente è il proprietario del rapporto.

Quando si esegue questa query:

$attractions = $CI->em->createQueryBuilder() 
     ->select('a', 'u') 
     ->from('\ListLovers\Model\Attraction', 'a') 
     ->leftJoin('a.users', 'u', \Doctrine\ORM\Query\Expr\Join::WITH, 'u.id = 4') 
->getQuery()->getResult(); 

I miei utenti contano per l'attrazione con id 1 è 1. Grande!

Ora, se io aggiungere un'altra riga alla tabella unirsi in questo modo:

---------------------------------- 
| user_id | attraction_id | 
---------------------------------- 
| 1    1    | 
| 4    1    | 
| 4    2    | 
| 4    3    | 
---------------------------------- 

... ed eseguire la stessa query, i miei utenti contano per l'attrazione con id pari a 1 è ... ZERO. Cosa?

Mi manca qualcosa?

Grazie, Mark.

+1

È necessario utilizzare i campi per collegarsi a un'altra tabella (l'identificativo personalizzato utilizzato) e i filtri devono trovarsi nella sezione "dove" nella query SQL. – ZhukV

risposta

0

Che cosa succede se si tenta in questo modo:

 $attractions = $CI->em->createQueryBuilder('a') 
         ->leftJoin('a.users', 'u') 
         ->addSelect('u') 
         ->where('u.id = :uid') 
         ->setParameter('uid', 4) 
        ->getQuery() 
        ->getResult(); 
2

Il modo migliore per molti-a-molti è MEMBER OF o NOT MEMBER OF.

$attractions = $CI->em->createQueryBuilder() 
     ->select('a', 'u') 
     ->from('\ListLovers\Model\Attraction', 'a') 
     ->where(':uid MEMBER OF a.users') 
     ->setParameter('uid', 4) 
     ->getQuery()->getResult(); 
Problemi correlati