Laravel模型"开始"日期属性被更改

时间:2016-10-27 13:13:01

标签: php laravel laravel-5 eloquent laravel-5.2

我有一个控制器,它通过请求对象更新模型。它看起来

$save_series = Series::where('id','=',$request->input('data.item.id'))->with('booking')->first();
$save_series->name              = $request->input('data.item.name');
$save_series->color                 = str_replace('#', '', $request->input('data.item.color'));
$save_series->production_company    = $request->input('data.item.production_company');
$save_series->booking->start        = $request->input('data.item.booking.start');
$save_series->booking->end          = $request->input('data.item.booking.end');
$save_series->booking->save();
$save_series->save();               

当我保存相关的"预订"对象已更新。如果"结束"日期属性被更改,然后"开始"属性的时间设置为当前时间;这不应该是这样的!它似乎完全忽略了解析的$ request开始时间。

在预订的相关模型上,我已经放置了一个setter mutator来查看问题是否存在于该点之前 - 日期正在被正确解析,但一旦它到达数据库就已经改变了。我的设置(仅适用于此测试)如下所示:

public function setStartAttribute($time) {
    error_log(":::::::::::TEST BELOW:");
    error_log($time);
    return $time;
}

错误日志结果为:

PHP message: :::::::::::TEST BELOW:
PHP message: 2016-10-27 00:00:00

然而,"开始&#34>的数据库字段对于此记录,请阅读:

2016-10-27 13:07:53

请有人解释一下这里到底发生了什么;我完全失败了!

- 根据要求提供的其他信息 -

迁移导致问题:

Schema::create('calendar_events', function (Blueprint $table) {
    $table->increments('id')->unsigned();
    $table->integer('calendar_event_type')->references('id')->on('calendar_event_types');
    $table->timestampTz('start');
    $table->timestampTz('end');
    $table->softDeletes();
    $table->timestamps();
});

修复问题的迁移解决方案:

Schema::create('calendar_events', function (Blueprint $table) {
    $table->increments('id')->unsigned();
    $table->integer('calendar_event_type')->references('id')->on('calendar_event_types');
    $table->dateTime('start');
    $table->dateTime('end');
    $table->softDeletes();
    $table->timestamps();
});

我认为这与MySQL对timestampTz的支持以及我将其发送到数据库的格式有关。改变了这个问题后,我的问题现在得到了解决,非常感谢@FrankProvost!

我认为现在不可能维持时区。在我的用例中,时区不会是一个问题,但它会很好。

1 个答案:

答案 0 :(得分:0)

我不知道原因,但在添加其他时间戳时(除了默认创建和更新时),您应该在添加默认时间戳后添加其他时间戳。

否则,表格似乎设置"设置更新时的当前时间戳"标记到错误的列。

而不是

$table->timestamp('my_custom_date');
$table->timestamps();

始终选择

$table->timestamps();
$table->timestamp('my_custom_date');