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

时间:2016-07-05 08:13:22

标签: doctrine-orm symfony soft-delete

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

  1. 加载软删除的实体
  2. 从数据库中删除实体,完全绕过软删除过滤器
  3. 那么如何禁用它?

3 个答案:

答案 0 :(得分:21)

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);
}

参考文献:

答案 1 :(得分:1)

只是一个小提醒。

如果要使用Gedmo Softdeletable硬删除实体,则必须在相应的批注中包含hardDelete=true,请参见:

@Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false, hardDelete=true)

编辑:hardDelete=true默认为true

有了这个,您不必禁用侦听器/过滤器。如果您有hardDelete=false,则上面建议的两次删除将不起作用。

来源:

答案 2 :(得分:-1)

former commentqooplmao中,发布了一个简单而有效的解决方案:

// Remove an entity entirely from the DB (skip soft delete)
$this->entityManager->remove($entity);
$this->entityManager->flush();
// Just run it a second time :-)
$this->entityManager->remove($entity);
$this->entityManager->flush();

只需再次发布它,以使其看起来更像个迷住机器人,从而使其更具可见性...