原则2 DQL - 选择行,其中一个多到多字段为空?(Doctrine 2 DQL - Selec

2019-06-24 07:15发布

我在这个例子中两个类 - DeliveryMethod和国家。 他们互相多对一对多的关系。

我想要做的就是选择一个没有任何国家映射到他们所有DeliveryMethods。

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

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'

Answer 1:

那这个呢? 假设$qb是您查询生成器实例

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

这将使你这是与国家的相关和联系国的计数为0的DeliveryMethods



Answer 2:

使用原则的is empty

它是专门用来检查空协会:

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

请参阅: 学说2 ORM文档:学说查询语言 (搜索“为空”)



Answer 3:

没有必要在连接和havings。 只需使用SIZE功能:

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

这会给你不附带国家所有方法



Answer 4:

不能参加NULL值,IIRC。 对于Twitter上错字道歉,应该说“不能”。



文章来源: Doctrine 2 DQL - Select rows where a many-to-many field is empty?
标签: php doctrine dql