2012-04-24 67 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 ... 
}