Doctrine2 Entity PrePersist - 更新另一个实体

时间:2013-11-22 09:50:48

标签: symfony doctrine-orm

我的Symfony2项目中有一个Doctrine2实体(称为实体A)。该实体与项目中的另一个实体(称为实体B)具有ManyToOne关系。

实体A具有“活动”或“非活动”状态属性。实体B中只允许一个“活动”实体A.因此,如果将新实体A添加到现有实体B,则具有“活动”状态的先前实体A需要更新为“非活动”。

实现这一目标的最佳方法是什么?

我正在考虑LifeCycle方法(prePersist),但我怀疑这是否有效,因为它是另一个实体,它比我坚持的实体更新。

代码示例:

class EntityA
{
    const ACTIVE = 'active';
    const INACTIVE = 'inactive';

    private $id;
    private $status;
    private $entityB;

    public function prePersist()
    {
        $currentEntityA = $this->entityB->getCurrentEntityA();
        if ($currentEntityA) {
            $currentEntityA->setStatus(self::INACTIVE);
        }
    }
}

class EntityB
{
    private $id;
    private $name;
    private $entityA;

    public function getCurrentEntityA()
    {
        foreach($this->entityA as $row){
            if ($row->getStatus() == EntityA::ACTIVE ) {
                return $row;
            }
        }
        //no entityA found so return null
        return null;
    }
}

2 个答案:

答案 0 :(得分:1)

在这种情况下,您应该使用prePersist侦听器/订阅者而不是LifecycleCallbacks。

在文档章节中了解更多相关信息 - How to register Event Listeners/Subscribers

btw订阅者被doctrine.event_subscriber标记(目前缺少文档章节)。

答案 1 :(得分:1)

您可以使用多种方法

  1. 学说事件听众
  2. 服务层
  3. 数据库触发器
  4. 在您的情况下,我认为更好地使用服务并将业务逻辑转移到那里