2016-07-05 56 views

Odpowiedz

13

1. Jak załadować miękkiej usuniętych podmiot

Zgodnie z dokumentacją, wyłącz filtr dla kierownika jednostki:

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

Aby umożliwić miękkie usuwać ponownie:

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

Note : Przed tą linią może być wymagane $em->clear();, jeśli jednostka została już załadowana z wyłączonym filtrem miękkiego usuwania.

2. Jak usunąć jednostkę z bazy całkowicie

Mimo że nie jest wymienione w dokumentacji, pierwsze rozwiązanie nie działa, jeśli trzeba usunąć podmiot oraz obejście filtra soft-Delete. Filtr musi być usunięty z detektorów zdarzeń encji kierownika:

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

Referencje:

+4

Filtr jest tylko zapytanie doktryna tak ma brak rzeczywistego połączenia z procesem płukania. Znacznie prostszym sposobem na trudne usuwanie byłoby uruchomienie '$ em-> remove ($ object); $ em-> flush ($ object); 'twice. Pierwszy flush ustawiłby teraz wartość "deletedAt". Drugi rozpoznałby, że 'deletedAt' został ustawiony wcześniej i zignoruje faktycznie delete - tyłek możesz zobaczyć tutaj https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php# L63-L71. – qooplmao

+0

@qooplmao Próbowałem tego z najnowszym tagiem (2.4.13) i to nie działa. Może teraz tylko z oddziałem głównym. –

+0

@qooplmao Twoja metoda działa doskonale. Myślę, że powinieneś opublikować to jako odpowiedź, ponieważ po raz pierwszy zignorowałem to. Odpowiedź Aurelijusa jest pouczająca, ale ostatecznie niepotrzebna. Próbowałem go z v2.5.5. – aalaap