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?