更新
如果在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
方法肯定被调用并设置了deletedOn
和deletedBy
属性,但是当我查看symfony分析器中的数据库查询时,它并没有包含UPDATE
语句,仅包含DELETE
语句。
有人知道我是否遗漏了某些东西,或者是否有更好的方法来实现这一目标?似乎如果我想创建或更新不同的实体,这样可以正常工作。但是,如果我尝试更新正在删除的相同实体,则Doctrine永远不会发出UPDATE
语句。
注意:数据库表具有插入后和更新后触发器,将行复制到存档表中。我需要在UPDATE
语句之前运行DELETE
语句,因此记录将被复制到具有deletedOn
和deletedBy
的适当值的归档表中。删除后触发器无法正常工作,因为数据库不知道当前Symfony用户是谁
答案 0 :(得分:0)
删除行胜过所有其他操作,当doctrine计算更新行的最小工作量时,如果删除该行,它只会这样做而不用担心更新。
答案 1 :(得分:0)
您需要使用postRemove
方法而不是preRemove
。您可以在flush
中执行postRemove
方法来更新任何其他实体。