2012-04-24 50 views
1

我剛剛陷入這種棘手的情況。 我有一個名爲禮物的實體。Doctrine2有條件的協會

現在禮物實體需要有一個叫做receiver場可與2個實體RegisteredUser實體或Guest實體相關聯。

這裏的問題是,現在我怎麼定義的接收器領域的關聯!

我想創建一個名爲GiftReceiver使用繼承映射實體的,但我不能鑑別映射到不延伸GiftReceiver類。

我是不是走錯路了?有沒有一種好的方法來實現這一點? 在此先感謝您的幫助! :)

+1

你想一個屬性映射到2個實體?也許你應該將它映射到一個普通的超類! – Songo 2012-04-27 12:05:11

回答

4

怎麼樣使得UserGuest一個子類,您可以接收外地剛映射到User實體。 當您第Gift獲取接收實體,學說將獲取適當的對象GuestRegisteredUser

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

也許你可以把邏輯到您的實體,返回GuestRegisteredUser,兩者都實現相同的接口,稱爲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 ... 
}