[Laravel]モデルの標準日付フォーマットを指定する

2019/08/07

課題

日付のフォーマットを YYYY-MM-DD から YYYY/MM/DD に変更したい。

結論

モデルのDateフォーマット

を設定しても、うまくいかずエラーになってしまう。(MySQL ・ PostgreSQL ・ SQLite で試してみたけれど変わらず)

画面上の出力形式を変更するには、Eloquentのアクセサ機能を利用する。

詳細

ほぼ Laravel インストール直後の状態からスタートして、インストール時に生成される users テーブルの CRUD 画面を作ってみます。

(参考:Laravel5.7: usersのCRUD機能を実装する – Qiita

で users テーブルが生成されます。

次にリソースコントローラーを生成。

これで app\Http\Controllers\UserController.php が生成されて、index() や create() なんかのメソッド定義だけが自動的に用意されます。

ルーティングは web.php に

と書けば、単純なCRUDについてはOK。

データが空なので、先に簡単な登録画面を作成してしまいましょう。

まずは登録画面を表示させるために、 app\Http\Controllers\UserController.php にて

としておきます。

ここで指定した “users.create” の 実体(htmlを出力するBladeファイル)として resources\views\users\create.blade.php を作成します。

※バリデーションもcssも何もないので良い子はマネしてはいけません。

入力したデータの行先は action=”url(‘users’)” となっていて、php artisan route:list で確認してみます。

POST の users は App\Http\Controllers\UserController@store ということで、 UserController の store メソッドを実装します。

(リソースコントローラー生成時にメソッド定義だけ自動的に用意されてます。)

ついでに、指定されたユーザーを表示する show メソッドを用意しておきましょう。(登録完了時に リダイレクトした先が無いと真っ白画面になってしまうのです。)

初期状態では仮引数が型宣言(タイプヒンティングという呼び方はPHP5の時代みたいっすよ)なしで show( $user ) になっていますが、show( User $user ) と型宣言してやることにより、Laravel の「モデル結合ルート」によってモデルを直接やり取りできるようになります。

そして、そのモデルをそのまま view() で Blade に渡してやります。

さて、動かしてみます。ブラウザで

http://localhost:8000/users/create

にアクセスすると、create.blade.php がレンダリングされます。

適当に値を入れて「登録」ボタンをクリックすると、

無事DBに登録されました。

さて、お次は、created_at と updated_at のカラム属性を変更してマイクロ秒まで持てるようにしてみます。

Laravel インストール時に生成されている users テーブルでは、

このように定義されているので、最後の行を

としてテーブルを再生成します。(↓データ消えるのでご注意を)

でテーブルが再生成されました。

DBツール(A5:SQL Mk-II 使ってます)で確認すると、

無事、timestamp(6) without time zone となりました。

さて、実はここからが本題なんですが、Laravelの公式ドキュメントには、

タイムスタンプフォーマットをカスタマイズする必要があるなら、モデルの$dateFormatプロパティを設定してください。

と書かれています。

「ほー。スラッシュ区切りにしよっと。」とか思って、

なんてやってみるんですが、これで上手くいったためしがありません…。

vendor\nesbot\carbon\src\Carbon\Traits\Creator.php#createFromFormatAndTimezone()

辺りで、日付の値と指定フォーマットが違うじゃん、って怒られてエラーになってしまいます。

「2019-09-10 みたいなハイフンじゃなくて、ハイフン区切りで 2019/09/10 って出したいんじゃい!」という場合は、 protected $dateFormat = で指定するのではなく、Eloquentのアクセサ機能を使って希望の書式を返してやる、ということのようです。

こうしてやることで、

希望通りの書式で表示されるようになりました。