2016-07-05 51 views

回答

13

1.如何加載軟刪除實體

按照該文檔中,實體管理器禁用過濾:

$em->getFilters()->disable('softdeleteable'); 
$object = $em->find('AppBundle:Object', 1); // soft-deleted entity will be loaded 

再次啓用軟刪除:

$em->getFilters()->enable('softdeleteable'); 

注:此行之前可能需要$em->clear();,如果實體已經加載了禁用的軟刪除過濾器。

2.如何從數據庫中完全

即使它不是在文件中提到刪除實體,如果你需要刪除實體和旁路軟刪除過濾器的第一個解決方案是行不通的。過濾器需要從實體管理器的事件偵聽器刪除:

// initiate an array for the removed listeners 
$originalEventListeners = []; 

// cycle through all registered event listeners 
foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) { 
    foreach ($listeners as $listener) { 
     if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) { 

      // store the event listener, that gets removed 
      $originalEventListeners[$eventName] = $listener; 

      // remove the SoftDeletableSubscriber event listener 
      $em->getEventManager()->removeEventListener($eventName, $listener); 
     } 
    } 
} 

// remove the entity 
$em->remove($object); 
$em->flush($object); // or $em->flush(); 

// re-add the removed listener back to the event-manager 
foreach ($originalEventListeners as $eventName => $listener) { 
    $em->getEventManager()->addEventListener($eventName, $listener); 
} 

參考文獻:

+4

過濾器只是一個學說的查詢,使其具有與沖洗過程沒有真正的聯繫。一個更容易的硬刪除方法是運行'$ em-> remove($ object); $ em-> flush($ object);'兩次。第一次沖洗會將「deletedAt」設置爲現在。第二個會認識到'deletedAt'已被設置,並且會忽略實際刪除 - 屁股你可以在這裏看到https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php# L63-L71。 – qooplmao

+0

@qooplmao我試着用最新的標籤(2.4.13),它不起作用。也許只有現在的主分支。 –

+0

@qooplmao你的方法工作得很好。我想你應該把它作爲回答,因爲我第一次忽略了它。奧雷利尤斯的答案是信息豐富的,但最終是不必要的。我用v2.5.5試了一下。 – aalaap

相關問題