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 刷新单个删除的实体的主要内容,如果未能解决你的问题,请参考以下文章