Softdeletable行为,真正删除实体

我使用DoctrineExtensions和StofDoctrineExtensionsBundle来获取软可删除的行为。

它在我的应用程序的前端运行得非常好。

在后端我需要“硬”删除实体的选项。

我禁用了我的管理控制器中的过滤器(我使用SonataAdmin):

$filters = $this->getModelManager()->getEntityManager($this->getClass())->getFilters();

if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) {
    $filters->disable('softdeleteable');
}

这是有效的(软删除的实体显示在列表中),但是当我尝试删除它时,实体会再次被软删除。 我如何强制“硬”删除?


您不需要禁用筛选器 - 它只是用于筛选select上的记录。 您必须禁用侦听器:

// $em is your EntityManager
foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) {
    foreach ($listeners as $listener) {
        if ($listener instanceof GedmoSoftDeleteableSoftDeleteableListener) {
            $em->getEventManager()->removeEventListener($eventName, $listener);
        }
    }
}

然后打电话

$em->remove($entity);
$em->flush();

不需要创建一个监听器或任何硬启动删除功能,并启用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();

在那个时候,它将被删除。

如果您在 - > remove($ entity)之后调用 - > flush()时已经在deletedAt字段中有有效日期,则您的实体将被硬删除


不是最优雅的方式:你总是可以用SQL进行真正的删除,它将绕过软删除

$em->createQuery("DELETE MyEntity e WHERE e = :et")->setParameter('et',$entity)->execute();
链接地址: http://www.djcxy.com/p/65027.html

上一篇: Softdeletable behaviour and really deleting the entity

下一篇: When should Doctrine filters be disabled in the SonataAdmin workflow?