2012-03-29 29 views
6

Estoy intentando averiguar cómo hacer una consulta de varios a varios en Doctrine 2 y parece que no puedo encontrar la respuesta. Sé exactamente cómo lo haría en SQL directo:Consulta de muchos a muchos en Doctrine 2

 SELECT ma.id, 
      ma.name 
     FROM user u 
     JOIN user_media_area uma ON uma.user_id = u.id 
     JOIN media_area ma ON uma.media_area_id = ma.id 

¿Cómo haría lo mismo con Doctrine?

+2

¿Por qué esta pregunta se realiza downvoted? –

Respuesta

5

El manual tiene algunos buenos ejemplos: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/query-builder.html

En su caso se vería algo así como:

// Build query 
    $em = $this->getEntityManager(); 
    $qb = $em->createQueryBuilder(); 

    $qb->addSelect('user'); 
    $qb->addSelect('mediaArea'); 

    $qb->from('SomeBundle:User','user'); 

    $qb->leftJoin('user.userMediaArea','userMediaArea'); 
    $qb->leftJoin('userMediaArea.mediaArea','mediaArea'); 

    $query = $qb->getQuery(); 
    $users = $query->getResult(); 
    echo $users[0]->getUserMediaArea()->getName(); 

No ha de poner un código de entidad así que tuve que hacer algunas conjeturas sobre cómo se ha definido las relaciones. Si solo tiene un ManyToMany simple entre el usuario y MediaArea, puede omitir la unión de UserMediaArea. D2 lo resolverá. Y como realmente solo quiere información de MediaArea, en realidad invertiría la consulta y haría una selección desde MediaArea, por lo que no sería necesario devolver la información del usuario. Pero estaba tratando de seguir tu consulta original.

+0

Gracias! Eso funciono. (He editado el código original de alguna manera, pero en el momento de este comentario, la edición aún no ha sido revisada por pares.) Gracias especialmente por comprender realmente mi pregunta y por usar los nombres de mi entidad en su respuesta. –

+0

@Cerad tiene alguna idea de cómo hacer esto en sql nativo con la asignación del conjunto de resultados. – hardik

+0

Tristemente no. En los pocos casos en los que he tenido que usar sql (por razones de rendimiento) hago los mapeos yo mismo. – Cerad

-1
SELECT ma.id, ma.name 
FROM User u 
JOIN u.media 

El usuario es la entidad de usuario, y u.media es la entidad de Medios.

+1

Gracias por la respuesta. ¿Qué pasa con la parte de PHP? ¿Cómo sería eso? –

+0

$ sql = 'SELECCIONE ma.id, ma.name FROM User u JOIN u.media'; \t $ result = $ entityManager-> createQuery ($ sql) -> getResult(); –

+0

No probé esto. Tras una inspección más cercana, su DQL ni siquiera se refiere a mi tabla de unión. ¿De dónde vendría tu 'ma'? Además, no tengo nada llamado 'media'. No estoy seguro de que lea mi pregunta o corrija su respuesta con demasiada atención. –

Cuestiones relacionadas