2011-09-23 25 views
12

Esto es probablemente uno fácil, pero no puedo resolverlo ni encontrar una respuesta.Buscar en la relación muchos a muchos con Doctrine2

Tengo un artículo simple y entidades de etiqueta de artículo con muchos a muchos relación. ¿Cómo puedo obtener todos los artículos con cierta etiqueta (o etiquetas)?

Mis intentos siguientes:

$qb = $repository->createQueryBuilder('a') 
    // ... 
    ->andWhere('a.tags = :tag') 
    ->setParameter('tag', 'mytag') 
    // ... 

o

->andWhere(':tag in a.tags') 
    ->setParameter('tag', 'mytag') 

... no funcionó. ¡Gracias!

+0

¿La relación de muchos a muchos es unidireccional o bidireccional? – Problematic

+0

@Problematic: He utilizado el mapeo unidireccional. ¿Cuál sería mejor para mi escenario? – Czechnology

+1

Si utiliza la asignación bidireccional, puede agregar un método 'getArticles()' a sus etiquetas y obtener la colección de artículos con la etiqueta. – Problematic

Respuesta

39

Y el ganador es ... redoble de tambores, por favor ...

$qb = $repository->createQueryBuilder('a') 
    // ... 
    ->andWhere(':tag MEMBER OF a.tags'); 
    ->setParameter('tag', $tag); 
    // ... 

Gracias a todos los que han Tomé el tiempo para leer y pensar en mi pregunta!

+0

Es trabajo para 1 etiqueta, pero ¿cómo se puede obtener todos los artículos por varias etiquetas? –

+1

@faost, creo que solo necesitaría agregar más cláusulas * where * y más parámetros. '...-> andWhere (': tag1 MIEMBRO de a.tags') -> setParameter ('tag1', $ tag1) -> andWhere (': tag2 MIEMBRO DE a.tags') -> setParameter ('tag2' , $ tag2) -> ...; '. También podría usar el método 'setParameters' para establecer todos los parámetros a la vez. – Czechnology

+1

¡Gracias! Simplemente iba a publicar exactamente esta pregunta, pero funcionó perfectamente – Matt

1

Creo que se puede adаpt este ejemplo (de documentación):

$query = $em->createQuery('SELECT u.id FROM CmsUser u WHERE EXISTS (SELECT p.phonenumber FROM CmsPhonenumber p WHERE p.user = u.id)'); 
+0

No pude conseguir que funcione en mi aplicación. ¡Gracias de cualquier manera! He publicado mi solución final como respuesta. – Czechnology

+0

Sugiero usar QueryBuilder en su lugar – user2019515

Cuestiones relacionadas