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

如何在Doctrine2中为单个实体使用多个存储库?

Doctrine2 - 无法删除具有单向 oneToMany 关系的实体

Doctrine 2 中的级联“刷新”是啥意思?

在 Doctrine2 上找不到实体异常

在Doctrine2上找不到实体

Doctrine2 多对一关联不会使用 JOIN 查询