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

2022-08-30 16:14:07

在此示例中,我有两个类 - 交付方法和国家/地区。他们彼此之间有多对多的关系。

我想做的是选择所有没有任何国家/地区映射到它们的交付方法。

我可以做相反的事情,那就是选择所有至少有一个国家的交付方式 -

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'

答案 1

使用教义is empty

它专门设计用于检查空关联:

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

参见:教义2 ORM文档:教义查询语言(搜索“是空的”)


答案 2

这又如何呢?假设是查询生成器实例$qb

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

这将为您提供与国家/地区关联的交付方法,并且相关国家/地区的计数为0


推荐