Eliminando registros de forma periódica en Eloquent con Laravel
A veces necesitamos eliminar registros antiguos de ciertas tablas (logs, soft deletes después de 30 días, mensajes, etc.).
Para hacer esto, podríamos programar un comando o un job que los vaya eliminando de forma periódica. Sin embargo, Laravel ya tiene esto cubierto para nosotros (¡cómo no!) con el trait Illuminate\Database\Eloquent\Prunable
o Illuminate\Database\Eloquent\MassPrunable
para eliminar muchos a la vez.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
class Flight extends Model
{
use Prunable;
/**
* Get the prunable model query.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function prunable()
{
return static::where('created_at', '<=', now()->subMonth());
}
}
Añadiendo el trait Prunable
a la clase, tendremos que definir el método prunable
, que devolverá una query con los elementos que se deben eliminar.
Una vez esto está hecho, debemos configurar en nuestro app/Console/Kernel.php
un cron que lance la eliminación de estos registros:
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('model:prune')->daily();
}