Softdeletable行为并真正删除实体

smo*_*ove 8 soft-delete symfony doctrine-orm symfony-2.1 sonata-admin

我正在使用带有StofDoctrineExtensionsBundle的DoctrineExtensions来获取软删除行为.

它在我的应用程序的前端非常有效.

在后端我需要"硬"删除实体的选项.

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

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

if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) {
    $filters->disable('softdeleteable');
}
Run Code Online (Sandbox Code Playgroud)

这工作(软删除的实体显示在列表中),但当我尝试删除它时,实体再次被软删除.我怎么能强行"硬"删除?

Dmi*_*riy 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后打电话

$em->remove($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)


小智 5

无需在启用softdeleteable的情况下创建一个侦听器或HARD删除的任何内容.

原来的softdeleteable事件有这一行:

$reflProp = $meta->getReflectionProperty($config['fieldName']);
$oldValue = $reflProp->getValue($object);
if ($oldValue instanceof \Datetime) {
    continue; // want to hard delete
}
Run Code Online (Sandbox Code Playgroud)

所有这些意味着如果你:

$entity->setDeletedAt(new \Datetime());
$em->flush();
Run Code Online (Sandbox Code Playgroud)

然后:

$em->remove($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

那时它将被删除.

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