Symfony Doctrine Listener - 在preRemove事件

时间:2017-10-21 02:34:42

标签: php symfony doctrine

更新

如果在flush侦听器中调用preRemove,但如果未调用flush,则可以正常工作。它最初没有工作的原因是由于我的其他一些代码阻止了flush被调用。

只是想提及这个以防其他人遇到这篇文章。

我在Doctrine preRemove事件中注册了Symfony Listener。在侦听器的preRemove方法中,我想更新在从数据库中删除之前要删除的实体。这是一些示例代码:

public function preRemove(LifecycleEventArgs $args)
{
    $em = $args->getEntityManager();
    $entity = $args->getEntity();
    $entity->setDeletedOn(new \DateTime());
    $entity->setDeletedBy($this->tokenStorage->getToken()->getUser());
    dump($entity); // this shows the updated columns
    $em->persist($entity);
    $em->flush(); // tried adding a flush to see if it would work
}

这不起作用。我可以看到preRemove方法肯定被调用并设置了deletedOndeletedBy属性,但是当我查看symfony分析器中的数据库查询时,它并没有包含UPDATE语句,仅包含DELETE语句。

有人知道我是否遗漏了某些东西,或者是否有更好的方法来实现这一目标?似乎如果我想创建或更新不同的实体,这样可以正常工作。但是,如果我尝试更新正在删除的相同实体,则Doctrine永远不会发出UPDATE语句。

注意:数据库表具有插入后和更新后触发器,将行复制到存档表中。我需要在UPDATE语句之前运行DELETE语句,因此记录将被复制到具有deletedOndeletedBy的适当值的归档表中。删除后触发器无法正常工作,因为数据库不知道当前Symfony用户是谁

2 个答案:

答案 0 :(得分:0)

删除行胜过所有其他操作,当doctrine计算更新行的最小工作量时,如果删除该行,它只会这样做而不用担心更新。

答案 1 :(得分:0)

您需要使用postRemove方法而不是preRemove。您可以在flush中执行postRemove方法来更新任何其他实体。