2012-11-26 7 views
7

DoctrineExtensionsStofDoctrineExtensionsBundleを使用して、ソフト削除可能な動作を得ています。ソフト削除可能な動作と実際にエンティティを削除する

私のアプリケーションのフロントエンドではうまく動作します。

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

私は私の管理コントローラ(私はSonataAdminを使用)でフィルタを無効にしている:

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

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

これは(ソフト削除されたエンティティがリストに表示)動作しますが、私はそれを削除しようとすると、エンティティはありません再びソフト削除されます。どのように強制的に "ハード"削除を行うことができますか?

答えて

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

をしてから

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

はどのようにあなたがこの後に再度有効にするには削除されますか? – Jessica

+0

@Jessica、あなたは 'addEventListener'を使うことができますhttp://api.symfony.com/2.4/Symfony/Bridge/Doctrine/ContainerAwareEventManager.html#method_addEventListener – Dmitriy

+0

ありがとう、私がやったことは、私がやったイベントの名前そこから削除し、それらをループして再追加します。 – Jessica

0

を呼び出します:

良いかもしれない独自のイベントリスナーを作成するかわりに、リスナーを無効にする必要がありますソリューション:

class SoftDeleteableListener extends BaseSoftDeleteableListener 
{ 

/** 
* @inheritdoc 
*/ 
public function onFlush(EventArgs $args) 
{ 
    $ea = $this->getEventAdapter($args); 
    $om = $ea->getObjectManager(); 
    //return from event listener if you disabled filter: $em->getFilters()->disable('softdeleteable'); 
    if (!$om->getFilters()->isEnabled('softdeleteable')) { 
     return; 
    } 

    parent::onFlush($args); 
} 

} 

あなたの設定で追加:

gedmo.listener.softdeleteable: 
    class: AppBundle\EventListener\SoftDeleteableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ @annotation_reader ] ] 

ソース:https://github.com/Atlantic18/DoctrineExtensions/issues/1175

2

は、最も優雅な方法:あなたは常に実数は、SQLと削除を行うことができ、それはsoftdeletable

$em->createQuery("DELETE MyEntity e WHERE e = :et")->setParameter('et',$entity)->execute(); 
4

HARDにリスナーか何かを作成する必要はありませんをバイパスしますsoftdeleteableを有効にして削除します。

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

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

あなたが出回っ呼び出すdeletedAtフィールド内の有効な日付がある場合 - >フラッシュ()の後に - >削除($エンティティ)エンティティは、ハード

+1

これは答えとして受け入れられるべきです。 – Veve

関連する問題