En una de las ultimas actualización de Laravel 8, introdujeron un nuevo trait para realizar limpieza de datos de las Bases de Datos. Se trata de Prunable, un trait que se encarga de eliminar por completo datos de nuestra base de datos periódicamente.
A modo de ejemplo de uso de este trait, podríamos tener una aplicacion en Laravel con el modelo Usuarios o Users y decirle con el trait de Prunable que si no verificaron la cuenta durante los últimos 3 meses, elimine el registro por completo ya que no los necesitamos.
Como integrar Prunable en los modelos
Es tan fácil como agregar cualquier otro trait a los modelos en Laravel y luego agregar un método prunable que va a tener nuestra condición para eliminar. Tenemos 2 Traits para utilizar el Prunable común y el MassPrunable
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\MassPrunable;
Prunable vs MassPrunable
La diferencia entre estos dos es solamente, que el MassPrunable no ejecuta los eventos de delete y deleted de los modelos a eliminar, haciéndolo mucho mas rápido que Prunable. Dependiendo de lo que se necesite es mas efectivo usar uno o el otro en nuestro proyecto de Laravel.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable; // or MassPrunable
class Post extends Model
{
use Prunable; // or MassPrunable
/**
* Determines the prunable query.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function prunable()
{
return $this->where('created_at', '<=', now()->subMonth());
}
}
En el ejemplo anterior se utiliza el trait Prunable para eliminar todos los modelos en donde fueran creados con una diferencia mayor a 1 mes. El método prunable() de Laravel se va a ejecutar al utilizar el comando necesario para “prunear”.
Cual es el comando para usar Prune en Laravel?
Para ejecutar la limpieza en Laravel para Modelos Pruneables tenemos dos opciones viables, una ejecutando o creando un comando periódicamente junto con Jobs y la segunda ejecutando manualmente el comando artisan.
php artisan db:prune
php artisan db:prune --model=Model
Photo by The Creative Exchange on Unsplash