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字段内有一个有效日期,您的实体将被硬删除
| 归档时间: |
|
| 查看次数: |
3792 次 |
| 最近记录: |