Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cuál es el método para hacer un borrado físico en la BD cuando estoy usando SoftDeleteable en SF2

13 de septiembre de 2016

Por consejo de un usuario de la comunidad (@RoberRielo) configuré mi aplicación para que use la función SoftDeleteable de Doctrine. Aplica un filtro de tal modo que cuando borro algún objeto se hace un borrado lógico (esto es justo lo que yo necesito).

Ahora quiero tener la posibilidad de eliminar físicamente de la BD las entidades que fueron eliminadas lógicamente con el SoftDeleteable. Estoy buscando algún método que me permita hacerlo, encontré muchos tutoriales e información para laravel pero nada para SF, bueno si encontré algunos pero no eran lo que yo busco.

Si alguien sabe como hacerlo, le agradezco la ayuda.

Gracias de antemano. Saludos. Atentamente.-


Respuestas

#1

Veamos, método como tal que yo sepa no hay dentro de la extensión, pero puedes hacer lo siguiente:

En tu clase Repository asociada a la entidad que has marcado con la extensión SoftDeleteable tendrías la consulta (ejemplo con una clase User):

class UserRepository extends EntityRepository { 
 
 public function deleteAllMarkedUsers()
   {
     $qb = $this->_em->createQueryBuilder();
     $qb->delete('u')
        ->from('AppBundle:User', 'u')
        ->where('u.deleteAt IS NOT NULL');
 
       return $qb->getQuery()->getResult();
    }

Nota: Te interesan solo las que tengan el campo deleteAt marcado o sea lleno con un datetime que son las que has eliminado lógicamente.

Ahora desde tu controlador puedes llamar la consulta que elimina las tuplas marcadas lógicamente.

$em = $this->getDoctrine()->getManager();
$em->getRepository('AppBundle:User')->deleteAllMarkedUsers();

Ten en cuenta que no lo he probado, es lo que se me ocurrió hacer. En caso que no funcione deja comentario para buscar otra via. Saludos.

@RoberRielo

14 septiembre 2016, 5:57
#2

Gracias Robert por tu respuesta. Quizás no me expliqué bien. Yo sé como recuperar las entidades borradas lógicamente. El problema con el SoftDelete es que no aliviano físicamente la BD. Lo que quiero hacer es un script que automáticamente borre físicamente (que verdaderamente elimine el registro de la tabla) las entidades que hacen más de una año que fueron borradas.

El problema que tengo es que no sé cual es la función que me permite borrar el objeto que ya fue eliminado con SoftDelete.

// Esto elimina la entidad de forma lógica.
$em->remove($entity);
$em->flush();

Probé lo siguiente y no funciona

$em->getFilters()->disable('soft-deleteable');
 
// Esto elimina la entidad de forma lógica.
$em->remove($entity);
$em->flush();

Con laravel existe un método (postDelete) que permite eliminar físicamente (borrar el registro de la tabla) cuando se habilitó el SoftDelet.

Si alguien tiene la solución se los agradezco, yo seguiré probando y de encontrarla la compartiré.

Gracias.

@gapiazza

14 septiembre 2016, 21:11