2009-09-24 10 views
6

Tengo el comportamiento de corrección de doctrina adjunto a todos mis modelos. ¿Hay alguna manera en que puedo borrar un disco en particular?¿Cómo separe un comportamiento en Symfony/Doctrine?

En cakephp recuerdo haber desprendido el comportamiento ... borrar el registro y volver a adjuntar el comportamiento.

¿Hay algo similar en symfony/doctrine? Si es así, ¿cómo puedo separar un comportamiento?

Cheers

Respuesta

9

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.

+1

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? –

+0

sí ... debería ... editado. – benlumley

+0

(aunque si las devoluciones de llamada están desactivadas, la eliminación suave no funciona) – benlumley

1

Intente llamar a esto, debe deshabilitar el comportamiento.

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

De manera sucia, puede generar una consulta SQL que elimine la entrada de la tabla.

+0

nah .. creo que está sucio !! .. gracias de todos modos .. – Yashvit

+0

OK. Pruebe la llamada que agregué. No lo he probado, pero creo que debería funcionar. – Zed

+0

genial ... le dará una oportunidad ... – Yashvit

1

link text creo que esta función y establecer el uso dql devoluciones de llamada a falso al igual que en el administrador debería hacer el truco :).

13

umm .. la SoftDelete behavior incluye una mucho mejor manera de hacer esto ... solo llame

$record->hardDelete(); 
+0

sí, recomiendo que esto se acepte antes de mi idea. Desde entonces he comenzado a usar esto. – benlumley

1

Se busca llegar a un acuerdo con Joshua Coady que la mejor manera sería utilizar

$record->hardDelete() 

Sin embargo, también quería agregar aquí ya que es uno de los primeros resultados en google para separar el comportamiento de la doctrina de que la manera más fácil de separar el comportamiento para "selects" es simplemente incluir "deleted_at" (o lo que sea que haya llamado su campo como en la consulta. El oyente se ve e si está incluido y si es así no filtra los registros eliminados.

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

devolverá registros eliminados.

5

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

Esto desactivará todos los oyentes de registro para este objeto.

Cuestiones relacionadas