概要
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',
];
使い方
Carbon
のformat
メソッドを利用する場合
$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としてシリアル化する場合に個別フォーマットする必要がない。