Php “拉威尔模型”;“开始”;正在更改日期属性

Php “拉威尔模型”;“开始”;正在更改日期属性,php,laravel,laravel-5,eloquent,laravel-5.2,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

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

$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
然而,该记录的“开始”数据库字段如下所示:

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


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

我不知道原因,但是当添加额外的时间戳(除了在创建和更新的默认时间戳之外)时,您应该在添加默认时间戳之后添加额外的时间戳

否则,该表似乎将“set current timestamp on update”标志设置为错误的列

而不是

$table->timestamp('my_custom_date');
$table->timestamps();
总是追求

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

我不知道这样做的原因,但是当添加额外的时间戳时(除了在创建和更新的默认时间戳之外),您应该在添加默认时间戳之后添加额外的时间戳

否则,该表似乎将“set current timestamp on update”标志设置为错误的列

而不是

$table->timestamp('my_custom_date');
$table->timestamps();
总是追求

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

唯一能解释这一点的是您的时间格式T是00h-12h,
$time
datetime格式可能是issue@ThibaultDumas正在解析的“2016-10-27 13:07:53”是一个问题吗?我想我记得我也有过这个问题。请将您的迁移添加到问题中。在创建默认时间戳之前,是否向表中添加了时间戳(默认时间戳除外)?可能您的sql表已设置为在更改时更新为当前时间。我将快速将其添加为问题以使其更为可见:)唯一可以解释这一点的是您的时间格式T为00h-12h,
$time
日期时间格式可能是issue@ThibaultDumas正在解析的“2016-10-27 13:07:53”是一个问题吗?我想我记得我也有过这个问题。请将您的迁移添加到问题中。在创建默认时间戳之前,是否向表中添加了时间戳(默认时间戳除外)?您的sql表可能已设置为在发生更改时更新到当前时间。我将快速将其添加为问题以使其更可见:)