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