Doctrine 2 DQL - Выберите строки, в которых поле «многие ко многим» пусто?

У меня есть два класса в этом примере - DeliveryMethod и Country. У них много-много-много отношений друг с другом.

Что я хочу сделать, это выбрать все методы доставки, для которых не назначены страны.

Я могу сделать наоборот, то есть выбрать все способы доставки, которые имеют хотя бы одну страну -

<code>SELECT m FROM DeliveryMethod m JOIN m.countries
</code>

Но я не могу понять, как сделать выбор, где поле стран пустое. В простом SQL я бы сделал следующее (deliverymethod_country - таблица ссылок):

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

Однако любой DQL-эквивалент этого не работает, например:

<code>SELECT m FROM DeliveryMethod m LEFT JOIN m.countries WHERE m.countries IS NULL
</code>

Что дает мне эту ошибку:

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

Ответы на вопрос(4)

Use Doctrine's is empty

$qb->select('m')->from('DeliveryMethods', 'm')->where('m.countries is empty')

Увидеть:Doctrine 2 ORM Документация: Doctrine Query Language (поиск по запросу "пусто")

 31 янв. 2017 г., 11:08
@spackmat Спасибо, и готово ;-)
 30 янв. 2017 г., 13:26
Лучший ответ. Я ищу способ использовать это вExpr контекст, см.stackoverflow.com/questions/41935897/…
 19 мая 2017 г., 14:51
Это должен быть главный ответ.

SIZE функция:

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

Это даст вам все методы без привязки стран

 03 дек. 2015 г., 18:04
в лучшем ответе исключаются исключения, в которых вам может понадобиться другой запрос из-за "наличия". Доктрина определит лучшую стратегию, например, она выполнит выборку, если отношение не извлечено.

IIRC. Извинения за опечатку в твиттере должны были сказать "не могу".

Решение Вопроса

$qb ваш экземпляр построителя запросов

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

Это даст вам DeliveryMethods, который связан со странами, и количество связанных стран равно 0

 18 янв. 2013 г., 14:06
У меня странная проблема, может быть, вы можете помочь?stackoverflow.com/questions/14387797/…
 09 мая 2012 г., 15:06
Ага :) Я отредактировал мой код
 22 сент. 2014 г., 21:48
@parisssss Я думаю, то же самое должно работать и в One-To-One. Если подумать, если левая сущность является владельцем, вы можете просто использовать$qb->expr()->isNull()
 22 сент. 2014 г., 21:34
@ Бронча, а как насчет отношений один на один?
 Gnuffo109 мая 2012 г., 15:04
Почти идеально, просто нужно изменить -> gt; join () на -> leftJoin (), потому что в противном случае он ограничивает запрос методами, которые имеют хотя бы одну страну, и возвращает пустой результат.

Ваш ответ на вопрос