删除preUpdate事件列表器中的实体

时间:2012-01-19 18:16:19

标签: symfony doctrine-orm

我有一个实体的preUpdate监听器,我会做一些计算,设置值等。

在那个监听器中,我想删除一些其他相关实体,但这似乎并没有被实体管理器刷新。我怎样才能实现这个目标?

2 个答案:

答案 0 :(得分:8)

根据Doctrine2 docs

  

永远不允许对更新后的实体的关联进行更改   这个事件,因为Doctrine无法保证正确处理   刷新操作此时的参照完整性。

这意味着您不应在preUpdate事件处理期间弄乱实体。我建议您使用实体管理器将逻辑移至服务层。写一个更新你的权利的具体方法,并在那里做所有复杂的东西。实体管理器的一个很好的例子是FOSUserBundle的UserManager

答案 1 :(得分:2)

如果您对preUpdate事件监听器中的实体进行了更改,则需要告诉工作单元重新计算该实体的变更集:

$em = $eventArgs->getEntityManager();
$cm = $em->getClassMetadata(get_class($entity));

$em->getUnitOfWork()->recomputeSingleEntityChangeSet($cm, $entity);