1

私は標準的な多対多の関係を設定しています。エンティティ A はエンティティ B の多くを持つことができ、その逆も可能です。

対応するエンティティ B を持たないすべてのエンティティ A のリストを取得しようとしています。SQL では、次のようなクエリを実行します。

SELECT a.* FROM entity_a a LEFT JOIN a_b r ON r.AID = a.id WHERE r.BID IS NULL

このクエリでは、a_b がリンク テーブルです。

同じ結果を得るために DQL ステートメントを作成 (または他の方法を使用) しようとしていますが、次の方法は機能しません。

SELECT s FROM VendorMyBundle:EntityA s LEFT JOIN VendorMyOtherBundle:EntityB u WHERE u IS NULL

どうすればやろうとしていることを達成できますか?

4

1 に答える 1

3

まず、通常はエンティティのプロパティ (つまりs ) で JOIN する必要があることを強調する必要があります。たとえば、次の代わりに:

SELECT s FROM VendorMyBundle:EntityA s 
  LEFT JOIN VendorMyOtherBundle:EntityB u WHERE u IS NULL

次のようなものが必要です。

SELECT s FROM VendorMyBundle:EntityA s 
  LEFT JOIN s.mylistofb u WHERE u IS NULL

ここで、エンティティ A で関係を次のように定義したとします。

class A{
    // ...

    /**
     * @ManyToMany(targetEntity="Vendor\MyBundle\Entity\EntityB")
     * @JoinTable(name="as_bs",
     *      joinColumns={@JoinColumn(name="a_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="b_id", referencedColumnName="id", unique=true)}
     *      )
     **/
    private $mylistofb;

これは、クエリがまだ機能していない場合は、次のことを試してください。

SELECT s FROM VendorMyBundle:EntityA s
  WHERE SIZE(s.mylistofb) < 1

これは前のものよりも簡単で、公式ドキュメントからも引用されています (つまり、「電話番号の例」を参照してください)。

于 2013-01-20T14:54:50.543 に答える