web-dev-qa-db-ja.com

Doctrine 2 DQL-多対多のフィールドが空の行を選択しますか?

この例には、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'
22
Gnuffo1

これはどうですか? $qbはクエリビルダーインスタンスです

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

これにより、国に関連付けられているDeliveryMethodsが得られ、関連付けられている国の数は0になります。

17
Broncha

Doctrineのis emptyを使用する

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

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

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

57
flu

結合や持ち物は必要ありません。 SIZE関数を使用するだけです。

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

これにより、国が付属していないすべてのメソッドが提供されます

14
pleerock

NULL値を結合できません、IIRC。 Twitterでのタイプミスについてお詫びしますが、「できません」と言っておくべきでした。

0
spacemonkey