LoginSignup
2
6

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-03-18

はじめに

プロジェクトでテーブルごとに『登録者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』を登録・更新できる。

2
6
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
2
6