Ccmmutty logo
Commutty IT
1 min read

LaravelのEloquentでtoArrayを使う場合はタイムゾーン設定が反映されないことがある

https://cdn.magicode.io/media/notebox/blob_66hL6Tu

結論

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);
    }

Discussion

コメントにはログインが必要です。