symfony2 generate consultas andwhere php doctrine dql

php - generate - Doctrine 2 DQL-¿Seleccionar filas donde un campo de muchos a muchos esté vacío?



find by id doctrine (4)

Tengo dos clases en este ejemplo: DeliveryMethod y Country. Tienen una relación de muchos a muchos entre sí.

Lo que quiero hacer es seleccionar todos los métodos de entrega que no tengan ningún país asignado.

Puedo hacer lo contrario, es decir, seleccionar todos los métodos de entrega que tengan al menos un país:

SELECT m FROM DeliveryMethod m JOIN m.countries

Pero no puedo averiguar cómo seleccionar dónde está vacío el campo de países. En SQL simple haría lo siguiente (deliverymethod_country es la tabla de enlace):

SELECT m.* FROM deliverymethods m LEFT JOIN deliverymethod_country dc ON dc.deliverymethod_id = m.id WHERE dc.deliverymethod_id IS NULL

Sin embargo, cualquier equivalente DQL de esto no funciona, por ejemplo:

SELECT m FROM DeliveryMethod m LEFT JOIN m.countries WHERE m.countries IS NULL

Lo que me da este error:

[Syntax Error] line 0, col 75: Error: Expected end of string, got ''m''



No hay necesidad de unir y tener. Simplemente use la función SIZE :

$qb->select(''m'') ->from(''DeliveryMethods'',''m'') ->where(''SIZE(m.countries) = 0'');

Esto te dará todos los métodos sin países adjuntos.


No se pueden unir valores NULL, IIRC. Disculpas por el error tipográfico en Twitter, debería haber dicho "no se puede".


Que hay de esto Asumiendo que $qb es su instancia del generador de consultas

$qb->select(''m'') ->from(''DeliveryMethods'',''m'') ->leftJoin(''m.countries'',''c'') ->having(''COUNT(c.id) = 0'') ->groupBy(''m.id'');

Esto le daría los métodos de entrega que están asociados con los países y el recuento de los países asociados es 0