💇‍♂️

Laravel 8.50 で追加された地味めな機能 Pruning Models

2021/07/15に公開

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