【Laravel】 prunableでモデルを定期的に削除する

2024年3月28日

こんにちは。本日はデータを簡単に定期削除する方法を解説します。Laravel8からの新機能になります。

システムを運用していると、時間とともにデータは蓄積されていきます。データの量が増えてくると徐々に検索速度が低下してきますので、システムのパフォーマンスが落ちてきます。そこで、データの保持期間を定め、期間を過ぎたものに関しては削除し、データ量の無制限な増加を防ぐことが重要です。

LaravelではEloquentのprune機能でデータを定期的に削除することができます。pruneとは刈り取るという意味です。伸びた芝生を刈り取るように、余計なデータを削除するという意味で命名されたのだと私は考えています。それではpruneの使い方を説明していきます。

pruneの使い方

Eloquentモデルのprunableメソッドをオーバーライドし、その中でモデルの削除条件を記述します。

    // 1ヶ月前のデータを削除
 public function prunable()
    {
        return static::where('created_at', '<=', now()->subMonth());
    }

上記の例ではcreated_atを条件に用いて、作成してから1ヶ月以上経過したデータを削除しています。created_atだけではなくあらゆる条件を指定可能です。

Eloquentモデルに定義したprunableを実行するにはphp artisan model:pruneコマンドを実行します。手動で実行することもできますが、やはり定期的に自動実行するようにした方が便利です。artisanコマンドを自動実行するにはapp/Console/KernelのScheduleメソッドから呼び出せばOKです。

protected function schedule(Schedule $schedule)
{
    // 毎日9時に実行
    $schedule->command('model:prune')->dailyAt('09:00');
}

scheduleを定義しただけだと定期的に実行はされないので、追加でCronやタスクスケジューラの設定が必要です。Laravelのスケジューラを使用してバッチを定期実行する方法を紹介している記事がありますので参考にしてみてください。【Laravel】スケジューラでバッチ処理を定期実行する

まとめ

いかがでしょうか。pruneを使用するとデータを定期的に削除する処理を簡単に記述することができます。この機能を使わない場合、独自にバッチ処理を作らなくてはなりませんからね。かなりマイナーな機能ですが覚えておくことをオススメします。

Laravel

Posted by kobainmac