2022-10-13 投稿

LaravelのTimestampsを日付時刻形式にする(Y-m-d H:i:s)

Laravel7以降、デフォルトではCarbonインスタンスになるタイムスタンプを従来のY-m-d H:i:s(yyyymmddhhiiss)での形式にします。

Laravel7からタイムスタンプの形式が変わった

Laravelが提供するMVCのモデル機能がEloquentです。

マイグレーションする際、timestamps()を定義することでタイムスタンプ型のcreated_at, updated_atカラムを定義できます。

Eloquentは、そのモデルのテーブルが変更または挿入されるときに自動的にその日時を設定してくれます。

Migrations

1<?php
2
3use Illuminate\\Database\\Migrations\\Migration;
4use Illuminate\\Database\\Schema\\Blueprint;
5use Illuminate\\Support\\Facades\\Schema;
6  
7return new class extends Migration
8{
9    /**
10     * Run the migrations.
11     *
12     * @return void
13     */
14    public function up()
15    {
16        Schema::create('flights', function (Blueprint $table) {
17            $table->id();
18            $table->string('name');
19            $table->string('airline');
20            $table->timestamps(); // created_at, updated_atカラムが追加される
21        });
22    }
23    ...
24};

この機能は便利なのですが、Laravel7以降では、Eloquentモデルでそのデータを取得する際にCarbonインスタンスを 返すようになり、さらにJSONにするとISO-8601形式の表記(2019-12-02T20:01:00.283041Zのような形式) になってしまいます。データを表示する際、この形式では見栄えが良くありません。

Laravel6以前でのY-m-d H:i:s(yyyymmddhhiiss)の表記に戻したいということがあるかもしれません。

ModelのserializeDateメソッドを上書き

Laravel7への移行ガイドの中でその説明がされています。

従来の形式で表示したい場合は、EloquentモデルのserializedDateをY-m-d H:i:sで返すようにオーバーライドします。

Upgrade Guide

1<?php
2
3namespace ApiModules\\Contract\\Models;
4
5use Illuminate\\Database\\Eloquent\\Model as BaseModel;
6use DateTimeInterface;
7
8class Model extends BaseModel
9{    
10    ...
11
12    protected function serializeDate(DateTimeInterface $date)
13    {
14        return $date->format('Y-m-d H:i:s');
15    }
16}

上記はデフォルトのModelに噛ませる形でアプリケーション共通のModelを定義し、 他のEloquentモデルはこのModelを継承することで全てのEloquentモデルでY-m-d H:i:s形式で表示することができるようになります。

補足

Laravelのtimestampsで定義されるcreated_at,updated_atなどのカラムはフレームワーク内部的な値なので アプリケーションとしてこれらの値を使うべきでないという意見もあります。

アプリケーションとして表示する値や日時は、これらのタイムスタンプとは別に定義してあげるのが良いかもしれません。