如何在Laravel中将现有属性设置为日期属性?

时间:2018-11-16 14:33:36

标签: laravel-5 php-carbon

我的一个模型上有start_dateend_date字段。

一段时间以来,我们一直将这些属性保存为Carbon个日期,而没有使用$dates属性:

start_date: {
    date: "2016-09-28 00:00:00.000000",
    timezone_type: NumberLong("1"),
    timezone: "-04:00"
},
end_date: {
    date: "2016-09-30 00:00:00.000000",
    timezone_type: NumberLong("1"),
    timezone: "-04:00"
}

我想利用Laravel中的$dates属性并将其转换为Carbon个日期。

但是,当我将它们简单地添加到属性中时,Laravel不满意:

protected $dates = ['start_date', 'end_date'];

然后尝试将它们转换:

foreach($models as $model) {
    $model->start_date = new Carbon($model->start_date);
    $model->end_date = new Carbon($model->end_date);
    $model->save();
}

在访问器上出错时:

exception: "ErrorException"
file: "/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php"
line: 760
message: "preg_match() expects parameter 2 to be string, array given"

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

<teens-internal teens="teens"></teens-internal>数组仅用于在加载数据库时将存储在数据库中的日期/日期时间字符串转换为Carbon实例。您无法将Carbon实例直接保存到数据库中,您应该首先在Carbon实例上调用teens之类的东西并存储该字符串。

https://laravel.com/docs/5.7/eloquent-mutators#date-mutators

编辑:我看到您的评论,您已将数据库中的日期保存为数组?您可能需要编写一个自定义访问器,以将这些日期转换为Carbon日期,因为Carbon仅解析字符串。

查看有关如何编写访问器的Laravel文档:https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor