2013-10-23 15 views
7

Sto costruendo un progetto Symfony2 e sto utilizzando gedmo/doctrine-extensions (GitHub) per implementare l'eliminazione software. La mia domanda è se c'è un modo per "disabilitare" o "sovrascrivere" softdelete, o anche rilevare se qualcosa è stato eliminato.Symfony2/Doctrine: lettura dei dati "cancellati" quando si utilizzano le estensioni della dottrina di Gedmo

Ecco la situazione:

ho un'entità "note" che fa riferimento a un'entità "utente". Una nota specifica fa riferimento a un utente che è stato eliminato. Anche se l'utente è stato cancellato, restituisce true per la logica "definita" di TWIG e può anche restituire l'id dell'utente eliminato. Tuttavia, se richiedo ulteriori informazioni (incluso il parametro "deletedAt" che indica se è stato eliminato o meno) ottengo un errore di 500 "Entità non trovata".

Poiché i dati sono effettivamente ancora lì, e poiché la nota stessa non è stata cancellata, mi piacerebbe comunque dire chi ha scritto la nota, anche se l'utente è stato cancellato.

È possibile? In caso contrario, come posso rilevare correttamente se qualcosa è stato eliminato? Come ho detto, $note->getUser() recupera ancora un oggetto e restituisce true per qualsiasi confronto null/"è definito".

+0

Questa è una limitazione nota Doctrine2, vedere https://github.com/doctrine/doctrine2/issues/4543 – PowerKiKi

risposta

6

È necessario impostare il rapporto di carico a eager, questo impedirà lazy loading di oggetti con un semplice nulla id e altro.

Potete trovare ulteriori informazioni sul caricamento ansiosi ed è l'annotazione qui:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-eager-loading

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html.

Per quanto riguarda il mio codice, questo è come sembra quando si definisce un collegamento a un User ora:

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="answers", fetch="EAGER") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

In questo caso, l'entità User può avere più answers. Quando si carica un User dalla prospettiva answer, questo funziona:

foreach($answers as $answer) { 
    $user = $answer->getUser(); 

    if (!$user) { 
     continue; 
    } 
} 
+0

Il link 'eager loading' alla documentazione non funziona –

+0

grazie, risolto :) – Oli

1

È possibile disattivare temporaneamente l'eliminazione software in modo che gli elementi eliminati vengano restituiti nei risultati. See the documentation, specificamente interessante per voi è la sezione che legge:

Questo disabiliterà il filtro SoftDeleteable, in modo da entità che erano appariranno nei risultati $ EM> getFilters "soft-deleted"() -> Disattiva ('soft-cancellabili');

Quindi, prima eseguire il codice qui sopra sul tuo gestore di entità $em e poi usarlo per raccogliere il vostro $note.

+0

Il problema è che don Voglio che le entità genitore (cioè le note) siano state eliminate. La disabilitazione del filtro restituirà anche le note cancellate che non desidero. –

14

È possibile effettuare questa operazione:

$filter = $em->getFilters()->enable('soft-deleteable'); 
$filter->disableForEntity('Entity\User'); 
$filter->enableForEntity('Entity\Note'); 
+3

Può essere ** 'softdeleteable' ** invece di 'soft-eliminabile' ... (sto usando le estensioni doctrine stof) – eDoV

Problemi correlati