2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LaravelでマスターデーターのCache化について

Posted at

マスターデーターを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して使っても良いかと思います。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?