Laravel 9 serializeDate()在其他列上不起作用

lnxxn5zx  于 2022-12-05  发布在  其他
关注(0)|答案(4)|浏览(286)

我想返回json,其中所有的时间戳数据类型都自动转换为ISO 8601。这在Laravel 7之后应该很容易实现,但我仍然面临这个问题。
我创建了两个数据类型为timestamp的列start_timeend_time。在以JSON返回结果时,Laravel只将created_atupdated_at转换为ISO 8601(例如2022-04- 26 T09:44:47.00000Z)。我创建的两个列按照它们在数据库中的存储方式返回(例如2022-01-17 19:45:07)。
我在serializeDate()中添加的替换默认方法的任何内容只会影响created_atupdated_at
我能得到的最接近的方法是将下面的内容添加到我的模型中,但它在格式上仍有细微差异(例如,2022-04- 26 T10:30:00 Z2022-04- 26 T09:44:47.00000Z)。

protected $casts = [
        'start_time' => 'date:Y-m-d\TH:i:s\Z',
        'end_time' => 'date:Y-m-d\TH:i:s\Z',

    ];
q43xntqr

q43xntqr1#

这可能不能直接回答问题,但我找到了一个变通办法。你可以做的是Carbon::parse那些列在返回到Json之前存储在数据库中。
以下是返回数据库中所有插槽的示例:

foreach ($slots as $slot) {
     $slot->start = Carbon::parse($slot->start_time);
     $slot->end = Carbon::parse($slot->end_time);
}

return response()->json($slots);
j8ag8udp

j8ag8udp2#

这仅仅是因为您需要告诉Laravel它应该将哪些列视为模型中的日期,默认情况下会考虑created_atupdated_at
有一个名为**$dates**的受保护属性,它接受一个包含所有被视为日期的列的数组。serializeDate方法会在该属性之后查找。

protected $dates = [
    'reception_date',
    'response_date' ,
    '...'
];

protected function serializeDate(DateTimeInterface $date)
{
    // you may give whatever format you want
    return $date->translatedFormat('d M Y à H:i');
}
x0fgdtte

x0fgdtte3#

您可以将列转换为dateserializeDate()函数将自动转换日期列

use DateTimeInterface;

class Project extends Model
{
    protected $casts = [
        'start_time' => 'date',
        'end_time' => 'date',
    ];

    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }
}
6kkfgxo0

6kkfgxo04#

若要修正这个问题,您可以覆写模型中的预设serializeDate()方法,并加入要以created_at和updated_at相同格式序列化的数据行。
例如:

public function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d\TH:i:s.u\Z');
}

您还可以使用Carbon库来处理日期格式:

public function serializeDate(DateTimeInterface $date)
{
    return Carbon::parse($date)->toIso8601String();
}

然后,在控制器中,您可以使用$with方法,以自订serializeDate()方法传回结果:

return Model::with([
    'start_time' => function($query) {
        $query->serializeDate();
    },
    'end_time' => function($query) {
        $query->serializeDate();
    },
])->get();

这将以所需的ISO 8601格式返回start_time和end_time列的结果。

相关问题