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

时间:2018-04-22 19:51:26

标签: laravel php-carbon laravel-5.6

我在让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日期的变异属性。

2 个答案:

答案 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