2016-07-05 52 views
6

Installare e usare l'estensione di comportamento SoftDeleteable per Doctrine 2 è abbastanza semplice. Il problema di solito è cercare di disabilitarlo per qualche parte del codice e abilitare nuovamente. Si consiglia di fare questo per:Come disattivare il filtro soft delete (Soft-delete) per doctrine in symfony

  1. entità del carico che è morbido-cancellato entità
  2. rimuovere dal database completamente bypassando soft-annullare il filtro

Così come disattivarlo?

risposta

13

1. Come caricare eliminata in entità

Come per la documentazione, disattivare il filtro per l'entità responsabile:

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

Per attivare soft-delete ancora:

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

Nota : $em->clear(); potrebbe essere richiesto prima di questa riga, se l'entità era già stata caricata con filtro soft-delete disabilitato.

2. Come rimuovere un'entità dal database interamente

Anche se non è menzionato nella documentazione, la prima soluzione non funziona se è necessario rimuovere entità e bypass filtro soft-delete. Filtro deve essere rimosso dal listener entità del gestore

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

Riferimenti:

+4

Il filtro è solo una query dottrina quindi ha nessuna vera connessione al processo di lavaggio. Un modo molto più semplice per eliminare hard sarebbe quello di eseguire il '$ em-> remove ($ object); $ em-> flush ($ object); 'due volte. Il primo flush imposterà il 'deletedAt' per ora. Il secondo riconoscerebbe che il 'deletedAt' è stato impostato in precedenza e ignorerà effettivamente delete - ass che puoi vedere qui https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php# L63-L71. – qooplmao

+0

@qooplmao Ho provato questo con l'ultimo tag (2.4.13) e non funziona. Forse solo con il master branch ora. –

+0

@qooplmao Il tuo metodo funziona perfettamente. Penso che dovresti postarlo come risposta, perché alla fine ho ignorato la prima volta. La risposta di Aurelijus è informativa, ma in definitiva non necessaria. L'ho provato con v2.5.5. – aalaap