我在让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
日期的变异属性。
编辑你的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;
}
}
如果模型表示表,则可以将数据类型更改为时间戳,并且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