_ LaravelでModelからのデータをtoArray()するとtimezoneがUTCになってしまう問題
_ 概要
タイトルのまんまです。
Modelからtimestamp型のデータを取得して、配列で扱おうと以下のように ->toArray()すると、日付がUTCになってしまいます。
1
2
3
4
5
| $result = Reservation::where('userid',1) ->orderBy('send_datetime','desc') ->limit(1)->get(); print_r($result->toArray());
|
[updated_at] => "2022-05-13T23:00:16.000000Z"
ほんとは
[updated_at] => 2022-05-14 08:00:16
になって欲しい。
もちろん、config/app.phpの timezone や、config/database.phpの timezone や、モデルのprotected $dates =の設定をしてもです。
_ 解決方法
- App\Models\Models を作成します
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <?php namespace App\Models; use DateTimeInterface;use Illuminate\Database\Eloquent\Model; class Models extends Model { // タイムゾーンを適用するフィールド protected $dates = ['updated_at',]; // toArray()したときに日付をUTCにしないためのoverride protected function serializeDate(DateTimeInterface $date): string { return $date->format('Y-m-d H:i:s'); } }
|
- モデル側でこいつをextendsします
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Database\Eloquent\Builder; class Reservation extends Models{ use HasFactory; use Encryptable; /** * 予約一覧を取得 * @return array */ public function getReservationAll(): array { return Reservation::get()->toArray(); }}
|
いじょです。
_ 参考文献
Wrong timezone with Eloquent Model timestamps on $model->get(), but correct with print_r()
https://stackoverflow.com/questions/63549021/wrong-timezone-with-eloquent-model-timestamps-on-model-get-but-correct-with
Category: [
Linux] - 10:44:05