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