如何在symfony中禁用doctrine的软删除(软删除)过滤器

Aur*_*nas 11 soft-delete symfony doctrine-orm

为Doctrine 2安装和使用SoftDeleteable行为扩展非常简单.问题通常是尝试为某些代码部分禁用它并再次启用.您可能希望这样做:

  1. 加载软删除的实体
  2. 完全绕过软删除过滤器从数据库中删除实体

那么如何禁用它呢?

Aur*_*nas 25

1.如何加载软删除的实体

根据文档,禁用实体管理器的过滤器:

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

要再次启用软删除:

$em->getFilters()->enable('softdeleteable');
Run Code Online (Sandbox Code Playgroud)

注意:$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);
}
Run Code Online (Sandbox Code Playgroud)

参考文献:

  • 过滤器只是一个学说查询,因此它与刷新过程没有真正的联系.更容易删除的方法是运行`$ em-> remove($ object); $ em-> flush($ object);`两次.第一次刷新会将`deletedAt`设置为now.第二个会认识到`之前已经设置`deletedAt`并且将忽略实际删除 - 你可以在这里看到https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php# L63-L71. (5认同)