Laravel 8 - 日期投射

问题描述 投票:0回答:2

我对 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 date casting laravel-8 php-carbon
2个回答
1
投票

正如你所说,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


0
投票

这是一个迟到的答案,但可能对某人或我自己有帮助。

Cast 不会格式化日期,因为它期望的是没有格式化选项的原始数据类型,与浮点数据类型相同,我们无法指定小数位。

要格式化日期,请使用模型上的 Carbon 格式选项

class Origin extends Model
{
    protected $dates = [
        'myDate' => 'datetime:Y-m-d\TH:i:s.vP'
    ];

}
© www.soinside.com 2019 - 2024. All rights reserved.