2016-07-05 3 views
6

Installieren und Verwenden von SoftDeleteable Verhalten Erweiterung für Doctrine 2 ist ziemlich einfach. Das Problem besteht in der Regel darin, es für einige Codeteile zu deaktivieren und erneut zu aktivieren. Sie können dies tun wollen:So deaktivieren Sie den Soft Delete (Soft-Deleable) Filter für die Doktrin in Symfony

  1. Last Einheit, die
  2. entfernen Entität aus der Datenbank soft-deleted ist vollständig unter Umgehung Soft-Filter löschen

So, wie es zu deaktivieren?

Antwort

13

1. Wie soft-deleted Einheit

Gemäß der Dokumentation laden, deaktivieren Sie Filter für Manager Einheit:

$em->getFilters()->disable('softdeleteable'); 
$object = $em->find('AppBundle:Object', 1); // soft-deleted entity will be loaded 

Damit Soft wieder löschen:

$em->getFilters()->enable('softdeleteable'); 

Hinweis : $em->clear(); ist möglicherweise vor dieser Zeile erforderlich, wenn die Entität bereits mit deaktiviertem Filter zum Löschen von Dateien geladen wurde.

2. Wie Unternehmen aus der Datenbank

entfernen völlig

Auch wenn es nicht in der Dokumentation erwähnt wird, ist die erste Lösung nicht, wenn Sie Unternehmen und Bypass-Soft-Löschfilter entfernen müssen. Filter muss von Entity Manager des Event-Listener entfernt werden:

// initiate an array for the removed listeners 
$originalEventListeners = []; 

// cycle through all registered event listeners 
foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) { 
    foreach ($listeners as $listener) { 
     if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) { 

      // store the event listener, that gets removed 
      $originalEventListeners[$eventName] = $listener; 

      // remove the SoftDeletableSubscriber event listener 
      $em->getEventManager()->removeEventListener($eventName, $listener); 
     } 
    } 
} 

// remove the entity 
$em->remove($object); 
$em->flush($object); // or $em->flush(); 

// re-add the removed listener back to the event-manager 
foreach ($originalEventListeners as $eventName => $listener) { 
    $em->getEventManager()->addEventListener($eventName, $listener); 
} 

Referenzen:

+4

Der Filter ist nur eine Lehre Abfrage so hat es keine echte Verbindung zum Spülvorgang. Ein viel einfacherer Weg zum Harddelete wäre das Ausführen des $ em-> remove ($ object); $ em-> flush ($ object); 'zweimal. Der erste Flush würde den 'deletedAt' auf jetzt setzen. Die zweite würde erkennen, dass die "deletedAt" zuvor festgelegt wurde und ignorieren tatsächlich löschen - ass Sie hier sehen können https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php# L63-L71. – qooplmao

+0

@qooplmao Ich versuchte dies mit dem neuesten Tag (2.4.13) und es funktioniert nicht. Vielleicht nur mit Master-Zweig jetzt. –

+0

@qooplmao Ihre Methode funktioniert perfekt. Ich denke, du solltest es als Antwort posten, da ich es das erste Mal ignoriert habe. Aurelijus 'Antwort ist informativ, aber letztlich unnötig. Ich habe es mit v2.5.5 versucht. – aalaap

Verwandte Themen