LoginSignup
26
4

More than 1 year has passed since last update.

はじめての記事投稿

Laravelでデータの変更履歴用トレイトをつくる

Posted at

内容:Laravelでデータの変更箇所を追跡する方法です。

なぜ書いたか:現場で変更履歴を表示させる処理が必要になったから。備忘録です。
Laravel Auditingというパッケージもありますが、今回はトレイトの作成にしました。

※記事では各ファイル作成コマンドの記載は省きます。
コマンドの一覧はこちらの記事をご参考ください!


① 履歴変更保存用のテーブルをデータベースに作成する

  • 話のメインになる項目は下記3つ。
    • カラム名を取得する'column_name'
    • 古い値を取得する'old_value'
    • 新しい値を取得する'new_value'

② モデルの作成

ChangedHisotry.php モデルです
//namespaceとかuseとか
class ChangedHistory extends Model
{   
   protected $table = 'changed_history'; //テーブル名

   protected $fillable = [
       'id',
       'column_name',
       'old_value',
       'new_value',
       'created_at',
   ];
}

こんな感じです。

③ トレイトの作成

  • \app\Traitsに作成。この場合はHasChangedHistory.phpにします。
HasChangedHistory.php トレイトです
//namespaceとかuseとか
trait HasChangedHistory
{
    public static function bootHasChangedHistory()
    {
        //updatedの時に動作する
        static::updated(function ($model) {
            //トレイト内の処理()を指定しています。
            $model->recordChangedHistory('updated');
        });
        /*createdやdeletedでも動作させたい場合は

            static::created(function ($model){
                このように追記
            });        
       
         */
    }

    public function recordChangedHistory($event)
    {   //DBの差分を取得するメソッドgetChanges()
        $changedAttributes = $this->getChanges(); 
        //連想配列を処理する
        foreach ($changedAttributes as $column_name => $newValue) {
            //変更前の値を取得するメソッドgetOriginal()
            $oldValue = $this->getOriginal($column_name);
            $changeHistory = \ChangedHistory::create([
                'id' => $this->id,
                'column_name' => $column_name,
                'old_value' => $oldValue,
                'new_value' => $newValue,
            ]);
        }
    }   
}

④ 変更を追跡したいモデルに追記する

FooModel.php 変更を追跡したいテーブルのモデルです
//色々なuse
use App\Traits\HasChangedHistory; //こちら!!!

class Foo extends Model
{
    //色々なuse
    use HasChangedHistory; //こちら!!!

上記設定をして、対象テーブルを変更するとchanged_historyテーブルに行が追加されているかと思います。

おわり


参考にした記事

また、初めてQiitaに投稿するので下記にも大変力をいただきました! :tiger:

26
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
4