我有一个实体的preUpdate
监听器,我会做一些计算,设置值等。
在那个监听器中,我想删除一些其他相关实体,但这似乎并没有被实体管理器刷新。我怎样才能实现这个目标?
答案 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);