laravel8 登録者IDと更新者IDを自動で設定(BaseModel)


はじめに

プロジェクトでテーブルごとに『登録者ID』『更新者ID』のカラムを持つことがある。
laravelでその更新共通処理を作成する。

テーブル作成

create.sql
-- メーカーマスタ
create table makers (
  id bigint unsigned not null auto_increment
  , name VARCHAR(100) not null
  , remarks text default null
  , deleted boolean default false
  , created_at DATETIME default current_timestamp
  , created_id bigint unsigned default 0
  , updated_at DATETIME default current_timestamp on update current_timestamp
  , updated_id bigint unsigned default 0
  , constraint makers_PKC primary key (id)
) ;

『created_id 』『updated_id 』に登録する処理を共通化する。

内容

laravel_app\app\Models\Maker.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

/**
 * メーカーマスタのモデルクラス
 */
class Maker extends BaseModel
{
    use HasFactory;
}
laravel_app\app\Models\BaseModel.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

/**
 * BaseModel Modelクラス
 */
class BaseModel extends Model
{
    /**
     * Event Hooks
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();
        // insert
        static::creating(function ($model) {
                if (Auth::check()) {
                    $model->created_id = Auth::id();
                    $model->updated_id = Auth::id();
                }
        });
        // update
        static::updating(function ($model) {
                if (Auth::check()) {
                    $model->updated_user_id = Auth::id();
                }
        });
    }
    protected $guarded = ['created_at', 'updated_at'];
    /**
     * Prepare a date for array / JSON serialization.
     *
     * @param  \DateTimeInterface  $date
     * @return string
     */
    protected function serializeDate(\DateTimeInterface $date)
    {
        // datetime日付フォーマットを変更
        return $date->format('Y-m-d H:i:s');
    }

今回の処理には関係ないが、
『protected $guarded』『protected function serializeDate』もBaseModel に追加する。

Maker::create($data);

あとは、createすれば自動で設定される。

マルチログイン

laravel_app\app\Models\BaseModel.php
<?php
        // insert
        static::creating(function ($model) {
            // 管理画面判定
            if (\Request::is('BO') || \Request::is('BO/*') || \Request::is('api/BO/*')) {
                if (Auth::guard('admin')->check()) {
                    // 管理画面
                    $model->created_id = Auth::guard('admin')->user()->id;
                    $model->updated_id = Auth::guard('admin')->user()->id;
                }
            } else {
                if (Auth::guard('user')->check()) {
                    // フロント画面
                    $model->created_id = Auth::guard('user')->user()->id;
                    $model->updated_id = Auth::guard('user')->user()->id;
                }
            }
        });
        // update
        static::updating(function ($model) {
            // 管理画面判定
            if (\Request::is('BO') || \Request::is('BO/*') || \Request::is('api/BO/*')) {
                if (Auth::guard('admin')->check()) {
                    // 管理画面
                    $model->updated_user_id = Auth::guard('admin')->user()->id;
                }
            } else {
                if (Auth::guard('user')->check()) {
                    // フロント画面
                    $model->updated_user_id = Auth::guard('user')->user()->id;
                }
            }
        });

マルチログイン時、guardを分ける場合は、上記のようにURLで分割する。
※上記までは、Model->updateでは処理が通らないことに注意

Model->updateに対応する場合

laravel_app\app\Models\BaseModel.php
<?php
use Illuminate\Database\Eloquent\Builder; // 追加
class BaseModel extends Model
{
   (省略)
    /**
     * EloquentBuilder オーバーライド
     * 
     * @param $query
     * @return CustomBuilder
     */
    public function newEloquentBuilder($query)
    {
        return new CustomBuilder($query);
    }
}

class CustomBuilder extends Builder
{
    public function update($values)
    {
        $values['updated_user_id'] = Auth::id();
        parent::update($values);
    }
}

■参考URL
Laravel で created_by, updated_by を自動で入れるのは思ったより辛かった件
https://zenn.dev/ad5/articles/5583b0e65b9d2140306b

おわり

これで自動的に『登録者ID』『更新者ID』を登録・更新できる。