LoginSignup
0
0

More than 1 year has passed since last update.

Laravel8.xのEloquentから$dates機能が消えた!?

Posted at

概要

LaravelのEloquentモデルにて日付プロパティをCarbonインスタンスとして扱いたい場合、Laravelのバージョン(7.xから8.x)によってキャストの仕方が異なります。

Eloquentでの日付キャストする方法

Laravel7.x 日付ミューテタ

モデルの$datesプロパティをセットすることにより、データ属性を追加できます。

protected $dates = [
    'seen_at',
];

Laravel8.x 日付のキャスト

Laravel8.xのドキュメントでは、日付ミューテタの記述がなくなっています。

デフォルトでは、Eloquentはcreated_atカラムとupdated_atカラムをCarbonのインスタンスへキャストします。これによりPHPのDateTimeクラスを拡張した、多くの便利なメソッドが提供されます。モデルの$castsプロパティ配列内で日付キャストを追加定義すれば、他の日付属性をキャストできます。通常、日付はdatetimeかimmutable_datetimeキャストタイプを使用してキャストする必要があります。

protected $casts = [
    'seen_at' => 'datetime:Y-m-d',
];

使い方

Carbonformatメソッドを利用する場合

$user = App\User::find(1);

return $user->seen_at->format('Y-m-d');

なお、配列やJSONにシリアル化する場合にはEloquentモデルで定義しているフォーマットを採用してくれるようです。

dateまたはdatetimeキャストを定義するときに、日付の形式を指定することもできます。この形式は、モデルが配列またはJSONにシリアル化される場合に使用されます。

まとめ

Eloquentの日付プロパティをCarbonインスタンスとして扱いたい場合は、Laravel8.xからは、$datesではなく$castsで定義する。
フォーマットも同時に定義しておけば、配列やJSONとしてシリアル化する場合に個別フォーマットする必要がない。

0
0
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
0
0