2012-04-18 15 views
5

Tengo un problema con Doctrine 2 y me uno a la izquierda en una relación mayomomany que estoy tratando de poner en práctica. Probablemente sea mi generador de consultas, pero parece que no puedo resolverlo.Doctrine 2 leftJoin, with, manytomany relationship, número incorrecto de filas devueltas

que tienen una tabla de unión de este modo:

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

Durante dos modelos, de usuario y de atracción, donde usuario es el propietario de la relación.

Al realizar esta consulta: cuentan

$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(); 

Mis usuarios de la atracción con id de 1 es 1. Gran!

Ahora bien, si puedo añadir otra fila a la tabla de unión de este modo:

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

... y realizar la misma consulta, mis usuarios cuentan para la atracción con id de 1 es ... CERO. ¿Que?

¿Echo de menos algo?

Gracias, Marca.

+1

Debe usar campos para unir a otra tabla (su identificador personalizado de uso), y los filtros deben estar en la sección "donde" en la consulta SQL. – ZhukV

Respuesta

0

¿Qué pasa si se intenta de esta manera:

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

La mejor manera para muchos-a-muchos es 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(); 
Cuestiones relacionadas