2009-09-24 20 views
6

Ho il comportamento softdelete di doctrine collegato a tutti i miei modelli. C'è un modo per cancellare un particolare record?Come scollegare un comportamento in Symfony/Doctrine?

In cakephp ricordo di aver staccato il comportamento ... cancellando il record e poi ricollegando il comportamento.

C'è qualcosa di simile in symfony/doctrine? Se è così allora come faccio a staccare un comportamento?

Cheers

risposta

9

Pensate mi piacerebbe andare per la via di Zed, ma per completezza:

Il metodo evento listener per cancellare (e selezionare) per il comportamento morbido eliminazione contiene:

if (! $query->contains($field)) { 
    // do the magic stuff to covert the query to respect softdelete 
} 

Ciò significa che se si menziona esplicitamente il campo nella query, non applicherà la trasformazione alla query.

Quindi, se si fa:

$q = Doctrine_Query::create() 
->delete('Table t') 
->where('t.id = ? AND t.deleted != 2 ', 1); 

esso non applicare la roba morbida eliminazione e sarà effettivamente eliminare il record. Si noti che è possibile fare qualsiasi cosa con t.deleted, ho appena fatto qualcosa che sarà sempre vero. Anche l'alias ('t.') È importante perché funzioni.

Questo trucco funziona anche per le selezioni, che è dove normalmente l'ho usato prima.

Come ho detto, però, credo che il suo più bello da fare:

$old_dqlc = Doctrine_Manager::getInstance()->getAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS); 
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false); 
$record->delete(); 
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, $old_dqlc); 

In particolare, è comunque possibile utilizzare il metodo delete() piuttosto che dover creare manualmente la query. L'uno più per il metodo di query è che se si hanno altri comportamenti collegati al record, saranno comunque rispettati.

+1

Probabilmente dovresti memorizzare il valore precedente di Doctrine :: ATTR_USE_DQL_CALLBACKS anziché impostare su false e true. Cosa accadrebbe se il CALLBACKS fosse disattivato prima che il codice venisse rilevato? –

+0

sì ... dovrei ... modificato. – benlumley

+0

(anche se le richiamate sono disattivate, l'eliminazione morbida non funziona) – benlumley

1

Prova a chiamare questo, dovrebbe disabilitare la gestione del comportamento.

$manager->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false); 

Come un modo sporco è possibile generare una query SQL che cancella la voce dalla tabella.

+0

nah .. penso che sia sporco !! .. grazie comunque ... – Yashvit

+0

OK. Prova la chiamata che ho aggiunto. Non l'ho provato, ma immagino che dovrebbe funzionare. – Zed

+0

cool ... darà un via ... – Yashvit

1

link text penso che questa funzione e l'impostazione di utilizzare i callback di dql su false, proprio come sul gestore, dovrebbero fare il trucco :).

13

umm .. il SoftDelete behavior include un modo molto più bello di fare questo ... basta chiamare

$record->hardDelete(); 
+0

sì - raccomandare questo è accettato prima della mia idea. Da allora ho iniziato a usare questo. – benlumley

1

Voleva essere d'accordo con Joshua Coady che il modo migliore sarebbe quella di utilizzare

$record->hardDelete() 

Tuttavia, volevo anche aggiungere qui poiché è uno dei primi risultati su google per distaccare il comportamento in dottrina che il modo più semplice per staccare il comportamento per "seleziona" è semplicemente includere "deleted_at" (o qualsiasi cosa tu abbia nominato il tuo campo come nella query. L'ascoltatore guarda se e se è incluso e in tal caso non filtra i record cancellati.

Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute(); 

restituirà i record cancellati.

5

$object->getListener()->setOption('disabled',true);

Ciò disattiverà tutti gli ascoltatori record per questo scopo.

Problemi correlati