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

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

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

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

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

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

【问题讨论】:

  • 您希望将单个属性映射到 2 个实体?也许你应该把它映射到一个普通的超类!

标签: orm doctrine-orm associations


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多