結論
LaravelのEloquentでattributeがconfig/app.phpのtimezoneの設定が反映されずUTCで取得されることがあります。
この条件は下記の通りです。
- toArrayまたはtoJson呼び出し時
- $castsプロパティにてdatetimeへのキャストが設定されているattribute
必要に応じてModelクラスのオーバーライドなど対策を行いましょう。
環境など
Laravel9系
理由
$castsにてdatetimeへキャストを設定したattributeは、jsonserializeの際、CarbonのtoJsonメソッドした値を返します。
この際、Carbonは必ずUTCの値を返すため、結果としてEloquentのtoArrayやtoJsonメソッドの結果もUTCになってしまいます。
EloquentがCarbonのtoJsonを呼び出している箇所: \Illuminate\Database\Eloquent\Concerns\HasAttributes::serializeDateメソッド
対策例
\Illuminate\Database\Eloquent\Concerns\HasAttributes::serializeDateメソッドを任意の形式で返却するようオーバーライドしましょう。
protected function serializeDate(DateTimeInterface $date): string
{
return $date->format(DateTimeInterface::RFC3339);
}