2012-01-19 229 views
3

我有一个preUpdate监听实体的,我做了一些计算,设定值等删除实体

在这种监听我想删除其他一些相关的实体,但是这似乎没有不被实体经理冲淡。我该如何去实现这个目标?

回答

8

按照Doctrine2 docs

由于Doctrine无法保证在刷新操作的这一点上正确处理 参照完整性,所以更新实体的关联更改不会在 此事件中被允许。

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

+0

听起来很不错,谢谢。 – DavidW

+0

我一直在寻找这个几个小时,一旦我把PreUpdate代码放入我的服务中,一切都变得简单了。感谢这个答案,这是最好的解决方案。 –

2

如果您在preUpdate事件监听器改变一个实体,你需要告诉工作单位重新计算该实体的变更:

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

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

我已经这样做了。除了我正在创建和删除一些其他实体的实体更改外,这些创建和删除操作也不会被刷新。 – DavidW

+0

它不适用于相关的子实体。 – felipsmartins