経緯
受発注の納期を今まで受発注側にあったのを明細側に移したい、という話が出たので修正にかかる。
日付は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');
}
を追加することで解決できました。