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:
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
@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. –
@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