この例には、DeliveryMethodとCountryの2つのクラスがあります。彼らはお互いに多対多の関係を持っています。
私がやりたいのは、国がマップされていないすべてのDeliveryMethodを選択することです。
逆のこともできます。つまり、少なくとも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'
これはどうですか? $qb
はクエリビルダーインスタンスです
$qb->select('m')
->from('DeliveryMethods','m')
->leftJoin('m.countries','c')
->having('COUNT(c.id) = 0')
->groupBy('m.id');
これにより、国に関連付けられているDeliveryMethodsが得られ、関連付けられている国の数は0になります。
is empty
を使用するこれは、空の関連付けをチェックするように特別に設計されています。
$qb->select('m')->from('DeliveryMethods', 'm')->where('m.countries is empty')
参照: Doctrine 2 ORMドキュメント:Doctrineクエリ言語 (「isempty」を検索)
結合や持ち物は必要ありません。 SIZE
関数を使用するだけです。
$qb->select('m')
->from('DeliveryMethods','m')
->where('SIZE(m.countries) = 0');
これにより、国が付属していないすべてのメソッドが提供されます
NULL値を結合できません、IIRC。 Twitterでのタイプミスについてお詫びしますが、「できません」と言っておくべきでした。