sql doctrine many-to-many dql

sql - Doctrine 2.1 DQL-Muchos a muchos consultan múltiples valores-¿Elemento en múltiples categorías?



many-to-many (1)

Para cualquier persona interesada, lo descubrí (dolorosamente). Doctrine debería explicar esto mejor en lugar de la única línea que tienen en la página de DQL ...

Básicamente no es una consulta AND, es una consulta MEMBER OF AND. Para cada categoría, se debe crear un MIEMBRO DE y luego agregarse a toda la consulta con un AND:

SELECT j, t FROM Entity/Item j LEFT JOIN j.itemImages t WHERE ?0 MEMBER OF j.categories AND ?1 MEMBER OF j.categories AND ?2 MEMBER OF j.categories, etc.

Eso devolverá todos los artículos que estén en todas las categorías solicitadas.

Esto puede parecer una petición rudimentaria, pero parece que no puedo hacerlo funcionar, así que o me estoy perdiendo algo estúpido o no entiendo cómo debería hacerse. Gracias por adelantado.

Tengo dos entidades doctrinales con una relación de muchos a muchos: elementos y categorías. A los que se unen items_has_categories.

/** * Item * * @Table(name="items") * @Entity(repositoryClass="Entity/Repository/Item") */ class Item { .... /** * @var Categories * * @ManyToMany(targetEntity="Categorie", inversedBy="items", cascade={"persist"}) * @JoinTable(name="items_has_categories", * joinColumns={ * @JoinColumn(name="items_id", referencedColumnName="id") * }, * inverseJoinColumns={ * @JoinColumn(name="categories_id", referencedColumnName="id") * } * ) */ private $categories; .... } /** * Categorie * * @Table(name="categories") * @Entity(repositoryClass="Entity/Repository/Categorie") */ class Categorie { ..... /** * @var Items * * @ManyToMany(targetEntity="Item", mappedBy="categories") */ private $items; .... }

Y lo que estoy tratando de hacer es ejecutar una consulta para devolver todos los elementos que están en todas las categorías "x", lo cual creo que debería ser un SELECT con y una cláusula AND:

class Item extends EntityRepository { public function findItemsByCategories($categories) { $qString = ''SELECT j, t, c FROM Technique/Entity/Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE''; $i = 0; foreach ($categories as $c) { $qString .= '' c.name = ?'' . $i; if ($i < (count($categories)-1)) { $qString .= '' AND''; } $i++; } $query = $this->_em->createQuery($qString); $query->setParameters($categories); return $query->getResult(); }

Ese pequeño fragmento de código no tiene errores y escupe la siguiente consulta SELECCIONAR DQL (cuando se envían 2 categorías en la matriz: $ categorías):

SELECT j, t, c FROM Technique/Entity/Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE c.name = ?0 AND c.name = ?1

Esto siempre está devolviendo una matriz vacía, es decir, sin resultados. Aunque en mi base de datos, hay más de 20 elementos que cumplen con los criterios: se encuentran en ambas categorías.

¿Alguien ve lo que estoy haciendo mal aquí? ¿Se supone que esto es una selección AND ...? Básicamente, me gustaría saber cómo consultar una relación de muchos a muchos en Doctrine 2+, donde hay más de un valor que se debe cumplir ...