Laravel 8.50 で追加された地味めな機能 Pruning Models
Ver.8.50 で追加された機能の1つで、不要になったデータを削除したりする時に役立ったりします。(prune … 刈り取る)
この機能が出る前、私の関わるプロジェクトで「登録後、3か月経過した投稿を定期的に削除する」という機能を作成しましたが、その際は、条件に合致するデータを削除するコマンドを1つ作って、そのコマンドを定期的に呼び出すという事をしましたが、この Pruning Models の機能を使えば、モデルファイルでトレイトを読み込み、メソッドを1つ用意し、後は定期的に model:prune コマンドを呼び出せば良いという感じになります。
参考:[8.x] Adds the possibility of having "Prunable" models #37889
参考:本家ドキュメント、Pruning Models
実際、どんな感じが
トレイトには2つあり、どちらかを使います。
Illuminate\Database\Eloquent\Prunable
Illuminate\Database\Eloquent\MassPrunable
MassPrunable の方は、ガツッと削除する為、モデルのイベントは発生しないのに対し、Prunable の方は、削除時、モデル個々のイベントが発生します。
で、使い方は、こんな感じです。(ドキュメントそのままですが…)
<?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());
}
}
後は、App\Console\Kernel で、例えば以下のように書いて、これを定期的に呼び出してやれば OK です。
protected function schedule(Schedule $schedule)
{
$schedule->command('model:prune')->daily();
}
その他詳しくは、ドキュメントをご確認下さい。
ちなみに、Ver.8.48.0 で、「Added a queue:prune-failed command」という機能も加わっておりますが、同じ prune でも、また別物ですね。
参考:[8.x] Add a queue:prune-failed command #37696
雑感
無くても大丈夫な機能ですが、あったらあったで使ってしまうかも知れませんね。
Discussion