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.
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? –
sì ... dovrei ... modificato. – benlumley
(anche se le richiamate sono disattivate, l'eliminazione morbida non funziona) – benlumley