2012-12-14 87 views
7

尝试删除一个实体,但不保留其他更改。请注意(虽然在这种特定情况下并非真正需要),但该方法不应影响行动后调用的结果flush()Doctrine2刷新一个删除的实体

$em->remove($entity); 
$em->flush($entity); 

抛出'InvalidArgumentException' with message 'Entity has to be managed for single computation

我可以只使用DQL做删除;只是想知道是否有办法通过实体经理来做到这一点。

+0

看起来像一个错误,那就是在去除状态管理的实体。 – meze

+0

@meze是的,认为它可能是。也认为冲洗一个对象可能是有限制的。 –

+0

@meze,我不认为上面的代码有bug。我看到的唯一不正确的事情是'flush()'没有收到任何参数。 – manix

回答

2

试试这个:

  1. 断开与当前EM实体:

    $em->detach($entity); 
    
  2. 创建EM的一个新实例,并使用它来删除:

    $em2->remove($entity); 
    $em2->flush(); 
    

或者,您可以使用方法clear()是负责脱离从EM所有实体,像这样:

$em->clear(); 
$em->remove($entity); 
$em->flush(); 
+0

它将刷新所有更改的实体。 – meze

+0

@meze,你是对的。发布更新 – manix

+1

@manix有趣的解决方法 - 更简单的方法就是使用DQL进行删除,但没有考虑创建实体管理器的第二个实例。 –

3

我忘了transactions,我将不得不测试:

// $em instanceof EntityManager 
$em->transactional(function($em) { 
    $em->remove($entity); 
}); 

只是不能肯定我可以使用交易如果实体在交易前后发生变化,则为而不是

1

简单的解决方案是:

$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(); 
+1

这是完全错误的。请再次阅读该问题:“仅删除单个实体”。 – nick4fake