0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelでdatetimeにcastsした値を渡したら、値が異なっていた

Posted at

経緯

受発注の納期を今まで受発注側にあったのを明細側に移したい、という話が出たので修正にかかる。
日付はFlatpickrで扱っているが、何故か編集画面において、表示上の日付とvalueの日付が異なっていたことが発覚。
例)
実際のデータの値:2024-02-02
表示上の値:2024-02-02
hiddenになってる実際にpostされる値:2024-01-31T15:00.000
みたいな感じ。

原因

受発注日とかもFlatpickr使ってるのに問題ないのになんでだろ?って思いましたが、心当たりが1つ。
明細部分はlivewireで作成してるんですよね。
で、そちらで扱いやすいように明細部分のデータを渡す際は配列化させたりjson化させたりしてます。
原因はここでした。
下記にある通り、Laravelではjson化した時や配列化した際は、serializeDateメソッドが走ってISO8601に変換されます。...なんで???????
https://laravel.com/docs/8.x/eloquent-serialization#date-serialization

単純にモデルから

    protected $casts = [
        ...
        'delivery_date' => 'datetime',
        ...
    ];

部分を消せば解決はできるけど、アクセサとかも直す必要あるからやりたくないなあ...。

解決策

というわけで上記にある通りserializeDateをオーバーライド。
明細モデルに

    protected function serializeDate($date)
    {
        return $date->format('Y-m-d');
    }

を追加することで解決できました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?