2012-12-14 88 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