🚀

Laravelで履歴テーブルに履歴を取る方法

2023/04/27に公開

実装

EloquentModel内にモデルイベントで実装する

protected static function booted()
{
    static::created(function (Post $post) {
        $post->postHistories()->create($post->toArray());
    });

    static::updated(function (Post $post) {
        $post->postHistories()->create($post->toArray());
    });
}

今回は作成時と更新時に履歴を取りたかったので、イベントリスナーでcreatedupdatedを使いました。
このようにすることで、各レポジトリ内で作成や更新が実行されると自動で履歴テーブルに保存されるようになります。

$post->postHistories()の部分は下記のようにリレーションで設定しています。

public function postHistories(): HasMany
{
    return $this->hasMany(PostHistory::class, 'post_id', 'post_id');
}

感想

Laravel Auditingを最近知って、これで履歴取ればいいかと思いましたが、
Auditingは主に監査用で使われ、誰がどんな変更を行なったのかを確認するの使い、
システム要件としての履歴を取りたいとはまた違うなと思い、今回の方法を取りました。

Discussion