在这个例子中我有两个类 - 交付方式和国家。他们彼此之间有多对多的关系。
我想做的是选择所有没有任何国家/地区映射到它们的交付方式。
我可以做相反的事情,那就是选择至少有一个国家/地区的所有交付方式 -
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'
使用教义的is empty
它专门设计用于检查空关联:
$qb->select('m')->from('DeliveryMethods', 'm')->where('m.countries is empty')
参见:教义 2 ORM 文档:学说查询语言(搜索"为空")
这个呢?假设$qb
是您的查询生成器实例
$qb->select('m')
->from('DeliveryMethods','m')
->leftJoin('m.countries','c')
->having('COUNT(c.id) = 0')
->groupBy('m.id');
这将为您提供与国家/地区关联的交付方法,并且关联国家/地区的计数为 0
不需要连接和拥有。只需使用SIZE
功能:
$qb->select('m')
->from('DeliveryMethods','m')
->where('SIZE(m.countries) = 0');
这将为您提供所有方法,而无需附加国家/地区
无法联接 NULL 值,IIRC。为推特上的错别字道歉,应该说"不能"。