6
爲Doctrine 2安裝和使用SoftDeleteable行爲擴展非常簡單。問題通常是試圖禁用某些代碼部分並再次啓用它。你可能想這樣做是爲了:即軟刪除 如何禁用symfony中doctrine的軟刪除(Soft-deleteable)過濾器
- 負荷實體軟刪除過濾
那麼如何禁用它?
爲Doctrine 2安裝和使用SoftDeleteable行爲擴展非常簡單。問題通常是試圖禁用某些代碼部分並再次啓用它。你可能想這樣做是爲了:即軟刪除 如何禁用symfony中doctrine的軟刪除(Soft-deleteable)過濾器
那麼如何禁用它?
按照該文檔中,實體管理器禁用過濾:
$em->getFilters()->disable('softdeleteable');
$object = $em->find('AppBundle:Object', 1); // soft-deleted entity will be loaded
再次啓用軟刪除:
$em->getFilters()->enable('softdeleteable');
注:此行之前可能需要$em->clear();
,如果實體已經加載了禁用的軟刪除過濾器。
即使它不是在文件中提到刪除實體,如果你需要刪除實體和旁路軟刪除過濾器的第一個解決方案是行不通的。過濾器需要從實體管理器的事件偵聽器刪除:
// 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);
}
參考文獻:
過濾器只是一個學說的查詢,使其具有與沖洗過程沒有真正的聯繫。一個更容易的硬刪除方法是運行'$ em-> remove($ object); $ em-> flush($ object);'兩次。第一次沖洗會將「deletedAt」設置爲現在。第二個會認識到'deletedAt'已被設置,並且會忽略實際刪除 - 屁股你可以在這裏看到https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php# L63-L71。 – qooplmao
@qooplmao我試着用最新的標籤(2.4.13),它不起作用。也許只有現在的主分支。 –
@qooplmao你的方法工作得很好。我想你應該把它作爲回答,因爲我第一次忽略了它。奧雷利尤斯的答案是信息豐富的,但最終是不必要的。我用v2.5.5試了一下。 – aalaap