9

DoctrineExtensionsStofDoctrineExtensionsBundleを使用して、ソフト削除可能な動作を取得しています。

それは私のアプリケーションのフロントエンドで本当にうまく機能します。

バックエンドでは、エンティティを「ハード」削除するオプションが必要です。

管理コントローラーでフィルターを無効にしました(SonataAdminを使用しています)。

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

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

これは機能します(ソフト削除されたエンティティがリストに表示されます)が、削除しようとすると、エンティティは再びソフト削除されます。「ハード」削除を強制するにはどうすればよいですか?

4

4 に答える 4

11

フィルターを無効にする必要はありません。選択時にレコードをフィルター処理するために使用されるだけです。代わりにリスナーを無効にする必要があります。

// $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();
于 2013-01-25T16:27:00.460 に答える
7

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();

その時点で、ハード削除されます。

->remove($entity) の後に ->flush() を呼び出すときに、deletedAt フィールド内に有効な日付が既にある場合、エンティティは完全に削除されます。

于 2017-01-12T13:38:28.263 に答える
2

最も優雅な方法ではありません:いつでもSQLで実際の削除を行うことができ、softdeletableをバイパスします

$em->createQuery("DELETE MyEntity e WHERE e = :et")->setParameter('et',$entity)->execute();
于 2016-03-17T13:38:28.673 に答える