creo que me voy por el camino de la zeta, pero está completo:
El método de detector de eventos de borrado (y seleccionar) para el comportamiento de borrar blanda contiene:
if (! $query->contains($field)) {
// do the magic stuff to covert the query to respect softdelete
}
Esto significa que si Mencione explícitamente el campo en la consulta, no aplicará la transformación a la consulta.
Así que, si lo hace:
$q = Doctrine_Query::create()
->delete('Table t')
->where('t.id = ? AND t.deleted != 2 ', 1);
no va a aplicar el material de eliminación suave y realmente eliminar el registro. Tenga en cuenta que puede hacer cualquier cosa con t.deleted, acabo de hacer algo que siempre será cierto. El alias ('t.') También es importante para que funcione.
Este truco también funciona para seleccionar, que es donde normalmente lo había usado antes.
Como digo, sin embargo, creo que es más agradable que hacer:
$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);
En particular, todavía se puede utilizar el método delete() en lugar de tener que crear manualmente la consulta. Una ventaja para el método de consulta es que si tiene otros comportamientos adjuntos al registro, estos seguirán siendo respetados.
Probablemente esté almacenando el valor anterior de Doctrine :: ATTR_USE_DQL_CALLBACKS en lugar de establecerlo en falso y verdadero. ¿Qué pasa si CALLBACKS está desactivado antes de que se encuentre el código? –
sí ... debería ... editado. – benlumley
(aunque si las devoluciones de llamada están desactivadas, la eliminación suave no funciona) – benlumley