我正在使用DoctrineExtensions和StofDoctrineExtensionsBundle来获取软删除行为。
它在我的应用程序的前端非常有用。
在后端我需要选择“硬”删除实体。
我已在管理员控制器中禁用过滤器(我使用SonataAdmin):
$filters = $this->getModelManager()->getEntityManager($this->getClass())->getFilters();
if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) {
$filters->disable('softdeleteable');
}
这有效(软件删除的实体显示在列表中),但是当我尝试删除它时,实体会再次被软删除。我怎么能强行“硬”删除?
答案 0 :(得分:10)
您不需要禁用过滤器 - 它仅用于过滤select上的记录。您必须禁用侦听器:
// $em is your EntityManager
foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) {
foreach ($listeners as $listener) {
if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) {
$em->getEventManager()->removeEventListener($eventName, $listener);
}
}
}
然后致电
$em->remove($entity);
$em->flush();
答案 1 :(得分:5)
无需使用softdeleteable启用HARD删除创建侦听器或任何内容。
原始的softdeleteable事件有这一行:
$reflProp = $meta->getReflectionProperty($config['fieldName']);
$oldValue = $reflProp->getValue($object);
if ($oldValue instanceof \Datetime) {
continue; // want to hard delete
}
所有这些意味着如果你:
$entity->setDeletedAt(new \Datetime());
$em->flush();
然后:
$em->remove($entity);
$em->flush();
此时它将被删除。
如果您在调用 - >> flush()之后已经在deletedAt字段内有一个有效日期 - >>删除($ entity)您的实体将被硬删除
答案 2 :(得分:2)
不是最优雅的方式:你总是可以用SQL做一个真正的删除,它会绕过softdeletable
$em->createQuery("DELETE MyEntity e WHERE e = :et")->setParameter('et',$entity)->execute();
答案 3 :(得分:0)
虽然这个问题有点旧,但对某人有用:
创建自己的事件监听器可能是更好的解决方案:
class SoftDeleteableListener extends BaseSoftDeleteableListener
{
/**
* @inheritdoc
*/
public function onFlush(EventArgs $args)
{
$ea = $this->getEventAdapter($args);
$om = $ea->getObjectManager();
//return from event listener if you disabled filter: $em->getFilters()->disable('softdeleteable');
if (!$om->getFilters()->isEnabled('softdeleteable')) {
return;
}
parent::onFlush($args);
}
}
并添加您的配置:
gedmo.listener.softdeleteable:
class: AppBundle\EventListener\SoftDeleteableListener
tags:
- { name: doctrine.event_subscriber, connection: default }
calls:
- [ setAnnotationReader, [ @annotation_reader ] ]
来源:https://github.com/Atlantic18/DoctrineExtensions/issues/1175