Doctrine2 刷新单个删除的实体
Posted
技术标签:
【中文标题】Doctrine2 刷新单个删除的实体【英文标题】:Doctrine2 Flush a Single Removed Entity 【发布时间】:2012-12-14 22:46:52 【问题描述】:尝试删除实体,而不保留其他更改。请注意(虽然在这种特定情况下它并不是真正需要的)该方法不应影响操作后调用的 flush()
的结果。
$em->remove($entity);
$em->flush($entity);
这会引发'InvalidArgumentException' with message 'Entity has to be managed for single computation
。
我可以只使用 DQL 进行删除;只是想知道是否有办法通过实体管理器来做到这一点。
【问题讨论】:
看起来像个bug,一个处于removed状态的实体被托管了。 @meze 是的,我想可能是这样。还认为刷新单个对象可能是有限制的。 @meze,我不认为上面的代码有错误。我看到的唯一不正确的是flush()
没有收到任何参数。
@manix 支持将实体传递给flush()
有been around for a while。
好吧...我应该更新我的 API xD
【参考方案1】:
我忘记了 transactions,我必须对其进行测试:
// $em instanceof EntityManager
$em->transactional(function($em)
$em->remove($entity);
);
只是不确定如果在事务之前和之后更改的实体不是在显式事务中,我是否可以使用事务。
【讨论】:
【参考方案2】:试试这个:
从当前 EM 中分离实体:
$em->detach($entity);
创建一个新的 EM 实例并使用它来删除:
$em2->remove($entity);
$em2->flush();
或者,您可以使用负责从 EM 中分离所有实体的方法 clear()
,如下所示:
$em->clear();
$em->remove($entity);
$em->flush();
【讨论】:
它将刷新所有更改的实体。 @manix 有趣的解决方法 - 更简单的是使用 DQL 进行删除,但没有考虑创建实体管理器的第二个实例。 有人能解释一下为什么首先需要整个解决方法吗?【参考方案3】:简单的解决方案是:
$entity = $em->manage($entity);
// $entity now refers to the fully managed copy returned by the merge operation.
// The EntityManager $em now manages the persistence of $entity as usual
$em->remove($entity);
$em->flush();
【讨论】:
这绝对是错误的。请再次阅读问题:“仅删除单个实体”。以上是关于Doctrine2 刷新单个删除的实体的主要内容,如果未能解决你的问题,请参考以下文章