2016-07-05 24 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

相关问题