Eliminando registros de forma periódica en Eloquent con Laravel

Eliminando registros de forma periódica en Eloquent con Laravel
Photo by Kinga Lopatin / Unsplash

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();
}