Doctrine2 中的条件关联

Posted

技术标签:

【中文标题】Doctrine2 中的条件关联【英文标题】:Conditional Association In Doctrine2 【发布时间】:2012-04-24 18:07:04 【问题描述】:

我刚刚遇到了这个棘手的情况。 我有一个名为 Gift 的实体。

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

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

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

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

【问题讨论】:

您希望将单个属性映射到 2 个实体?也许你应该把它映射到一个普通的超类! 【参考方案1】:

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

【讨论】:

【参考方案2】:

也许您可以将逻辑放入您的实体中,返回 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 ...

【讨论】:

【参考方案3】:

创建类似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

【讨论】:

以上是关于Doctrine2 中的条件关联的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine2 关联持久性

Doctrine2:对关联应用过滤器

什么时候才值得在Doctrine2中保持反向关系?

是否可以在没有目标实体的情况下在 Doctrine2 中建立关联?

从doctrine2中的代理对象获取“true”对象

Doctrine 2 中的级联“刷新”是啥意思?