我在让Laravel将自定义属性转换为headlines.stream()
.map(s -> s.contains("'") ? s.replace("'", "\\'") : s)
.forEach(System.out::println);
日期时遇到问题。这是一个示例模型:
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
个实例。应用程序,但是如果你然后将模型作为Json返回,则最终得到:
Carbon
取代期望的:
{
"name": "Big Business",
"my_date": {
"date": "2018-01-01 00:00:00.000000",
"timezone_type": 3,
"timezone": "Europe/London"
}
}
有没有其他人遇到过此问题,如果有,您是否找到了解决方案?
经过进一步调查,我已经找到了问题(但我还没有解决方案)。当您返回一个Eloquent模型时,运行{
"name": "Big Business",
"my_date": "2018-01-01 00:00:00"
}
方法的__toString
魔术方法,当您追踪链时,它会序列化toJson
变量中的任何碳日期。它也完全跳过了这个变异属性的序列化,这是我所看到的。
我需要找到一种方法来seralize在调用$dates
时返回Carbon
日期的变异属性。
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
如果您的模型代表表格,则可以将数据类型更改为时间戳,而laravel会将该属性放入一个碳对象中。
该属性是碳对象后,您可以在刀片视图中更改格式。
{{ $organisation->mydate->format('Y-m-d') }}
如果无法更改数据类型,或者需要使用不同于时间戳的默认格式,则可以使用“ cast”雄辩的模型属性。
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