Doctrine 2 DQL - 选择多对多字段为空的行?

时间:2012-05-09 10:11:05

标签: php doctrine dql

我在这个例子中有两个类 - DeliveryMethod和Country。他们之间有着多对多的关系。

我想要做的是选择没有任何国家映射到它们的所有DeliveryMethod。

我可以这样做,即选择至少有一个国家的所有交付方式 -

SELECT m FROM DeliveryMethod m JOIN m.countries

但我无法弄清楚如何选择国家/地区字段为空的位置。在纯SQL中,我会执行以下操作(deliverymethod_country是链接表):

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

但是,任何与此等效的DQL都不起作用,例如:

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

这给了我这个错误:

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

4 个答案:

答案 0 :(得分:47)

使用Doctrine的f.input :foto, as: :file, input_html: { multiple: true }

它专门用于检查空关联:

is empty

请参阅:Doctrine 2 ORM Documentation: Doctrine Query Language(搜索“为空”)

答案 1 :(得分:17)

这个怎么样?假设$qb是您的查询构建器实例

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

这将为您提供与国家/地区相关联的DeliveryMethods以及相关国家/地区的计数为0

答案 2 :(得分:14)

没有必要加入和拥有。只需使用SIZE功能:

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

这将为您提供所有没有附加国家/地区的方法

答案 3 :(得分:0)

无法加入NULL值,IIRC。对推特上的错字道歉,应该说“不能”。