マスターデーターをDBで管理する際にSQLのJoinで一緒に取得する場合も多くありますが、実装上で可読性や色んな理由で別のSQLで参照場合もあると思います。
やりたいこと
実装したらあまり気にしなくてもシステム上でCache化と更新が行うようにしたい。
実装
モデルのsavedイベント利用してCacheを削除することでデーターが更新された場合は
Cacheが取得されるタイミングで更新されることを実装してみました。
/app/Models/MasterModel.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
class MasterModel extends Model
{
/**
* Table
*
* @var string
*/
protected $table = 'mst_sample';
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['created_at'];
/** updated_atは使用しない */
public $timestamps = false;
/**
* The "booting" method of the model.
*
* @return void
*/
public static function boot()
{
parent::boot();
self::saved(function($master) {
Cache::forget('master.id.'.$master->id);
});
}
/**
* IDでマスター情報を取得
*
* @param string $id
* @return mixed
*/
public static function findWithCache($id = null) {
$ret = Cache::rememberForever("master.id.{$id}", function() use($id) {
if (is_null($id)) {
return null;
}
return static::find($id);
});
return $ret;
}
}
もちろん、親のfind等をOverrideして使っても良いかと思います。