26

この例には、DeliveryMethodとCountryの2つのクラスがあります。彼らはお互いに多対多の関係を持っています。

私がやりたいのは、国がマップされていないすべてのDeliveryMethodsを選択することです。

私は反対のことをすることができます、それは少なくとも1つの国を持っているすべての配達方法を選択することです-

SELECT m FROM DeliveryMethod m JOIN m.countries

しかし、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

Doctrineを使用するis empty

これは、空の関連付けをチェックするように特別に設計されています。

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

参照:Doctrine 2 ORMドキュメント:Doctrineクエリ言語(「isempty」を検索)

于 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 に答える