2012-04-24 19 views
1

私はこのトリッキーな状況に自分自身を走らせました。 私はギフトと呼ばれるエンティティを持っています。Doctrine2の条件付き結合

ギフトエンティティは、receiverというフィールドを持つ必要があります。このフィールドは、2つのエンティティRegisteredUserエンティティOR Guestエンティティに関連付けられます。

ここでの問題は、受信者フィールドの関連付けを定義する方法です。

GiftReceiverという継承マッピングを使用するエンティティを作成すると思ったが、GiftRceiverを拡張しないクラスに識別子をマッピングすることはできません。

私は間違った方法ですか?これを実装する良い方法はありますか? 事前にお手数をおかけしていただきありがとうございます。 :)

+1

RegisteredUser適切なオブジェクトを取得しますか?代わりに、それを共通のスーパークラスにマップする必要があります。 – Songo

答えて

4

方法GuestとしてUserのサブクラスを作り、あなただけのUserエンティティに受信機のフィールドをマップすることができますについて。あなたはGiftに受信エンティティをフェッチすると は、教義はあなたが単一のプロパティが2つのエンティティにマッピングすることにしたいGuestまたは

0

GiftIntermediaryエンティティのようなものを作成することはどうでしょうか。次のフィールドで:

Receiver 
RegisteredUser 
Guest 

続いて、次の関連付けを適用します。ここでは

Gift.Receiver = GiftIntermediary.Receiver 
RegisteredUser.ID = GiftIntermediary.RegisteredUser 
Guest.ID = GiftIntermediary.Guest 

は、上記の団体からのデータを収集するためのサンプルクエリです:

SELECT Gift.*, RegisteredUser.*, Guest.* 
FROM Guest INNER JOIN (RegisteredUser INNER JOIN (Gift INNER JOIN GiftIntermediary ON Gift.Receiver = GiftIntermediary.Receiver) ON RegisteredUser.ID = GiftIntermediary.RegisteredUser) ON Guest.ID = GiftIntermediary.Guest 
1

たぶん、あなたはロジックを置くことができますあなたのエンティティにはGuestまたはRegisteredUserが返され、両方ともGiftReceiverという同じインターフェイスが実装されています。

class Gift { 

    // mapped to guest; nullabe true 
    protected $guest; 

    // mapped to registeredUser; nullabe true 
    protected $registeredUser; 


    public function getReceiver() 
    { 
     return $this->getGuest() ?: $this->getRegisteredUser(); 
    } 

    // getters/setters ... 
}