[PHP][Laravel] 【UTC対応】Eloquent ミューテタを使ってDBデータ取得時にタイムゾーンの日時に変換する

バージョン

Laravel 5.7

概要

Eloquentミューテタを使ってDBに登録されているUTC日時をユーザのタイムゾーン日時に変換して取得させる。

ミューテタを使えば日時だけでなく小文字大文字変換など色々できるので下記でご確認。
readouble.com

コード

mutate関数を作成。場所はmiddleware配下でもapp配下の共通クラスでも良い。
例ではapp/Utils配下とする。
■UtilDate.php

use Carbon\Carbon;
class UtilDate
{
    public static function mutate($value)
    {
        // デフォルトタイムゾーン(UTCとする)
        $date = new Carbon($value, 'UTC');
        if (Auth::check()) {
            // Usersテーブルに関連したUser_Profilesテーブルにtimezoneカラムがあるとする
            $timezone = Auth::user()->load('userProfile')->userProfile->timezone;
            $date->setTimezone($timezone);
        }
        return $date;
    }
}

User_Profilesテーブルからの値取得については下記に記載。
waterfalls.hatenablog.com




日時変換したいModelのミューテタでmutate関数を呼ぶ。
■Model

class LoginInfo extends Model
{
    // 日時変換対象のカラムを指定
    protected $dates = [
        'created_at',
        'updated_at',
        'deleted_at'
    ];

    // カラム一つ一つにgetColumnNameAttributeを呼ぶ
    public function getCreatedAtAttribute($date)
    {
        return UtilDate::mutate($date);
    }
    public function getUpdatedAtAttribute($date)
    {
        return UtilDate::mutate($date);
    }
    public function getDeletedAtAttribute($date)
    {
        return UtilDate::mutate($date);
    }
}

これで該当ModelからDB参照すれば日時が指定タイムゾーンで変換される。




PHPフレームワーク Laravel入門

PHPフレームワーク Laravel入門