26

在这个例子中我有两个类——DeliveryMethod 和 Country。它们彼此之间具有多对多的关系。

我想要做的是选择没有任何国家映射到它们的所有 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'
4

4 回答 4

78

使用教义is empty

它专门用于检查空关联:

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

请参阅:Doctrine 2 ORM 文档:Doctrine Query Language(搜索“is empty”)

于 2016-10-12T12:43:24.260 回答
22

那这个呢?假设$qb是您的查询构建器实例

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

这将为您提供与国家相关联的 DeliveryMethods,并且相关国家的数量为 0

于 2012-05-09T12:48:38.073 回答
16

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

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

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

于 2014-10-08T14:54:29.287 回答
0

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

于 2012-05-09T12:34:51.467 回答