Doctrine2中的条件关联

时间:2012-04-24 18:07:05

标签: orm doctrine-orm associations

我刚刚陷入这种棘手的境地。 我有一个名为Gift的实体。

现在,礼物实体需要有一个名为receiver的字段,该字段可以与2个实体RegisteredUser实体或Guest实体相关联。

现在问题是如何定义接收器字段的关联!!

我想创建一个名为GiftReceiver的实体使用继承映射,但我无法将鉴别器映射到不扩展GiftReceiver的类。

我走错了路吗?有没有一个好方法来实现这个? 在此先感谢您的帮助!! :)

3 个答案:

答案 0 :(得分:4)

如何将User的子类设为Guest,您只需将接收器字段映射到User实体即可。 当您在Gift上获取接收器实体时,doctrine将获取相应的对象GuestRegisteredUser

答案 1 :(得分: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 ...
}

答案 2 :(得分: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