Cómo borrar y restaurar registros usando soft delete en laravel

Soft Delete en laravel

¿Quién no a escuchado esta frase alguna vez?

“Nunca elimines los datos de la base de datos”

Y te preguntaras entonces…

¿Para qué existe el método delete en Eloquent?

Es evidente que para borrar, pero Laravel cuenta con dos forma de hacerlo, una borra físicamente el registro o modelo de la base de datos y el otro solo lo marca como “borrado”.

Para explicar el porque de esto, que te parece si lo vemos con un ejemplo.

Vamos a suponer que tienes un modelo de blog muy sencillo, donde los usuarios tienen relacionado sus posts y en las migraciones tienes configurado el borrado en cascada.

Ahora intentemos borrar un usuario

Esta simple acción va a eliminar el usuario y todos sus posts!

y es aquí donde te pido que tomes un momento y pienses…

¿Qué pasa si esto fue por error?

Si fuera por error no tendrías forma de recuperar los datos.

Y es aquí donde comenzamos a sudar frio… Y mas si no tienes backups!

Lo que vimos es un caso sencillo, pero en la vida real las cosas son mas complejas y el borrado en “cascada” realmente no existe, eso es algo que nos proporciona nuestra base de datos.

Tan solo imagina que pasaría si en una tienda se pudiera borrar un producto o un pedido.

¿Cómo auditarían las ventas el departamento contable?

¿Cómo afectaría tener pedidos con un producto borrado?

Y ni que decir si fue una operación por error

Tendríamos…

 

CAOS

 

Pero tranquilo, antes de que corras a revisar tu código, déjame decirte que afortunadamente; estos son escenarios que no son nuevos en nuestra profesión por lo cual existen soluciones.

Y Laravel cuenta con el segundo estilo de borrado, que “marca” los elementos indicando que ya no están disponibles en el sistema.

A este estrategia se le conoce como soft delete, lo mejor de todo es que Eloquent te permite trabajar con ella de forma nativa!.

Y mejor aún, cuando lo implementes no tendrás que cambiar casi nada, lo cual me parece genial.

Así que relájate y disfrutemos viendo como podemos usar Soft Delete a nuestro favor.

Como funciona

Esta parte es sencilla de explicar, cuando borras un elemento o modelo en realidad no se remueve físicamente de la base de datos, en lugar de eso se marca como “borrado” ocultando este registro de las operaciones del usuario.

Afortunadamente esta parte ya esta implementada en Laravel, así que solo tenemos que decirle a los modelos como usar soft delete.

Veamos como implementar esto en nuestro modelos.

Qué debo hacer para usar Soft Delete en Laravel

Esta es una tarea muy sencilla que se resuelve haciendo los siguientes pasos:

  1. Agregando el campo deleted_at en tus migraciones.
  2. Debes de agregar el Trait SoftDeletes a tus modelos
  3. Agrega el campo deleted_at a la propiedad $dates

Modifica las migraciones de tus modelos

Muy bien para este ejemplo vamos a agregar el campo deleted_at a los modelos User y Post

como sigue

Cambiamos nuestro modelo Post

Es posible que hayas observado que esta configurado el onDelete en cascada y esto nos va a servir para los casos en los que realmente se requiere forzar el borrado del registro.

No olvides ejecutar tus migraciones!

Agreguemos el Trait SoftDeletes y la propiedad dates

Para nuestro modelo User, vamos a tener lo siguiente

He agregado un método mas para manejar la relación con los Posts que le pertenecen al usuario.

El modelo Post va a quedar algo similar al de User.

Con esto finalizamos los cambios, ahora solo tenemos que probar !

Ocultando modelos a la vista

Esta parte te va a encantar ya que para borrar un modelo;

No tienes que hacer absolutamente nada nuevo!

es tan sencillo como esto

Con eso borras el usuario con id = 1, si haces una consulta nuevamente, obtendrás null para ese usuario.

Igual puedes borrar todos los usuarios o usar una condición y obtendrás los resultados correctos.

¿Puedo consultar los modelos borrados?

Por supuesto que sí, de hecho podemos hacerlo de dos formas:

La primera es usar withTrashed

Con esto obtenemos todos los usuarios, incluyendo los que han sido borrados; observa el campo deleted_at.

Si solo quieres los elementos borrados, podemos usar onlyTrashed, como en el siguiente ejemplo.

y por supuesto puedes hacer cualquier consulta que regularmente haces, así que esto es valido

Como recuperas modelos borrados

Eso también es una operación muy sencilla.

Recuperemos el usuario que hemos borrado previamente (User con id = 1)

De igual forma puedes recuperar todos los registros borrados

O solo recuperar los que cumplan cierta condición

Y finalmente la cereza del pastel.

¿Qué pasa si quiero borrar algo de forma permanente?

Para eso tenemos forceDelete

Con eso, removemos de forma permanente el usuario y sus posts, así que ten cuidado!

¿Soft delete también borra en cascada?

Caramba!

Eso si te lo debo, Laravel no soporta borrado en cascada para soft delete!

Entonces, que hacemos
Entonces, que hacemos

Pero no te preocupes, siempre existen formas de solucionar esto, y ahí es donde

Llega soft cascade al rescate!

Que es un paquete que funciona para Laravel 5.5 y 5.6  y que es increíblemente fácil de usar.

Instalemos soft cascade

Esto como ya sabes, es mediante Composer

$ composer require askedio/laravel-soft-cascade

Sí quieres instalar para la versión 5.5 tienes que agregar “^5.5”

Agregando soft cascade a tus modelos

Solo Tenemos que agregar un trait (SoftCascadeTrait) y una propiedad ($softCascade) que le indica a Soft Cascade la relación o relaciones en las que debe de aplicar el borrado en cascada.

Y es todo!

Ahora, para nuestro ejemplo solo vamos a usar el Trait en el modelo User y la relación que vamos a usar pare el borrado en cascada es la de posts, que previamente ya tenemos en el modelo.

Así que nuestros cambios deben de lucir de la siguiente forma

Y esto, es todo lo que tenemos que configurar.

Ahora solo tenemos que hacer una prueba, así que borremos el usuario con id 2 con todo y sus posts.

Así de sencillo, y con la misma operación que soft delete!

De igual forma todas las operaciones que hicimos con Soft Delete, son igual de validas con Soft Cascade.

Hemos llegado…

Por supuesto, al final de este articulo!

Así que ahora te toca experimentar con el borrado lógico (Soft Delete), realiza pruebas y no olvides revisar la documentación.

Espero que te haya gustado este articulo y recuerda dejar un comentario, nos gusta saber tu opinión.

Y por supuesto no olvides compartir!

Comparte este artículo

Entra en la discusión y deja tu comentario

Veces