Laravel自定义属性未被变为Carbon日期

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

我在让Laravel将自定义属性转换为Carbon日期时遇到问题。这是一个示例模型:

class Organisation extends Model
{
    protected $dates = [
        'my_date'
    ];

    public function getMyDateAttribute() 
    {
        return "2018-01-01 00:00:00";
    }
}

我希望my_date被投射到Carbon日期但是如果我做dd($organisation->my_date)它只是将日期作为字符串返回。

我见过人们建议只从自定义属性返回一个Carbon实例,这部分有用,my_date属性可以作为应用程序中的Carbon实例,但是如果你然后将模型作为Json返回,你最终得到:

{
    "name": "Big Business",
    "my_date": {
        "date": "2018-01-01 00:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/London"
    }
}

而不是期望的:

{
    "name": "Big Business",
    "my_date": "2018-01-01 00:00:00"
}

有没有其他人遇到这个,如果是这样你找到了解决方案?


更新

经过进一步调查,我已经找到了问题(但我还没有解决方案)。当你返回一个Eloquent模型时,运行__toString方法的toJson魔法方法,当你追踪链时,它会序列化$dates变量中的任何碳日期。它也完全跳过了这个变异属性的序列化,这就是我所看到的。

我需要找到一种方法来seralize在调用Carbon时返回__toString日期的变异属性。

laravel php-carbon laravel-5.6
2个回答
2
投票

编辑你的Organization模型:

use Carbon\Carbon;
class Organisation extends Model
{


    public function getMyDateAttribute($value) 
    {
        //you can manipulate the date here:
        $date = Carbon::parse($value,config('timezone'));
        return $date;
    }
}

0
投票

如果模型表示表,则可以将数据类型更改为时间戳,并且laravel将该属性放入碳对象中。

属性为碳对象后,您可以更改刀片视图中的格式。

{{ $organisation->mydate->format('Y-m-d') }}

如果要么无法更改数据类型,要么需要与时间戳不同的默认格式,则可以使用“强制转换”eloquent模型属性。

class Organisation extends Model{

     protected $cast = [
         'mydate'=>'datetime:Y-m-d H:i:s'
     ];

 }

有效地转换属性与使用碳对象包装日期值的访问器相同。然而,这是更清晰的写作方式。

就时区而言,您应该在config / app.php文件中进行更改。

这是文档.... https://laravel.com/docs/5.8/eloquent-mutators#attribute-casting

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