我对 Laravel 8 中使用 Date Casting (https://laravel.com/docs/8.x/eloquent-mutators#date-casting)感到困惑。
我需要从数据库获取,格式为Y-m-d\TH:i:s.vP
的所有
日期字段;例如:
1990-02-12T01:08:12.820+00:00
。
为此,在我的
Origin
模型中,我设置:
class Origin extends Model
{
protected $casts = [
'myDate' => 'datetime:Y-m-d\TH:i:s.vP'
];
}
现在,字段
myDate
被转换为 Carbon
:
$ php artisan tinker
>>>
>>> $origin = App\Origin::first();
>>>
>>> dd($origin->myDate);
Illuminate\Support\Carbon @634784892^ {#4629
#constructedObjectId: "000000005620d556000000007f71416e"
#localMonthsOverflow: null
#localYearsOverflow: null
#localStrictModeEnabled: null
#localHumanDiffOptions: null
#localToStringFormat: null
#localSerializer: null
#localMacros: null
#localGenericMacros: null
#localFormatFunction: null
#localTranslator: null
#dumpProperties: array:3 [
0 => "date"
1 => "timezone_type"
2 => "timezone"
]
#dumpLocale: null
date: 1990-02-12 01:08:12.820 UTC (+00:00)
}
>>>
>>>
但是当我获得属性时,输出不遵循格式
Y-m-d\TH:i:s.vP
:
>>>
>>> echo $origin->myDate;
1990-02-12 01:08:12⏎
>>>
>>>
为了获得所需的格式,我需要再次格式化它:
>>>
>>> echo $origin->myDate->format('Y-m-d\TH:i:s.vP');
1990-02-12T01:08:12.820+00:00⏎
>>>
>>>
或在使用之前转换模型
toArray()
:
>>>
>>> echo $origin->toArray()['myDate'];
1990-02-12T01:08:12.820+00:00⏎
>>>
>>>
设置日期格式并获得正确输出的最佳实践是什么?我想用:
>>>
>>> echo $origin->myDate;
1990-02-12T01:08:12.820+00:00⏎
>>>
>>>
谢谢你
正如你所说,laravel 转换格式不起作用,你可以创建这样的访问器
class Origin extends Model
{
protected $casts = [
'myDate' => 'datetime:Y-m-d\TH:i:s.vP'
];
public function getMyDateAttribute($value)
{
return $value->format('Y-m-d\TH:i:s.vP');
}
}
它将确保您始终返回此格式
参考链接https://laravel.com/docs/8.x/eloquent-mutators#defining-an-accessor
这是一个迟到的答案,但可能对某人或我自己有帮助。
Cast 不会格式化日期,因为它期望的是没有格式化选项的原始数据类型,与浮点数据类型相同,我们无法指定小数位。
要格式化日期,请使用模型上的 Carbon 格式选项
class Origin extends Model
{
protected $dates = [
'myDate' => 'datetime:Y-m-d\TH:i:s.vP'
];
}