在Laravel 5.3中,我正在使用Model事件执行某些操作。在大多数情况下,一切都很好,程序流中只有一处数据没有更新。
这是整个故事:
我有一个包含courses
和weeks
的数据库结构。因此,课程1包含Week1,Week2等。
然后重复给定的课程,我也有courseinstance
和weekinstance
,其中包含课程和星期的给定实例的日期信息。
我在后端使用Angular处理CRUD,当我创建course
时,它会自动创建courseinstance
,其中start_date
和end_date
为空。 / p>
course
API控制器中的代码为
$thiscourse= \App\Courses::create(Input::all());
之后,course
模型将执行以下操作:
public static function boot() {
parent::boot();
static::created(function($course) {
// add first instance of this course - dates will be null at this point
$instance = new Coursesinstance;
$instance->course_id = $course->id;
$instance->save();
});
}
那是成功的。然后在后端,向课程添加一个星期(用于获取有关该周主题的描述性数据),并创建该周的第一个实例,其中包含开始日期和结束日期。首先在API week
控制器中,我们有以下内容:
$week = \App\Week::create(Input::all());
然后触发模型上的create
事件,然后转到:
static::created(function($week) {
// add first instance of this week
$instance = new Weekinstance;
$instance->week_id = $week->id;
$instance->weekstart = $week->weekstart;
$instance->zoomstart = $week->zoomstart;
$coursesinstance_id = DB::table('coursesinstance')
->select('id')
->where('course_id', $week->courses->id)
->first();
$instance->coursesinstance_id = $coursesinstance_id->id;
$instance->save();
});
这是成功的,在数据库中一切正常,所有关系都正确,各种id都应该正确。
现在,由于创建了新的一周实例,我们在Weekinstance模型中进行了研究,以便我可以查看实例中的所有星期并更新课程实例的开始和结束日期。
static::created(function($weekinstance) {
// get all week instances corresponding to this course instance
$weekinstances = DB::table('weekinstance')
->select('*')
->where('coursesinstance_id', $weekinstance->coursesinstance_id)
->get();
$weekstarts=array();
foreach ($weekinstance as $instance)
{
$weekstart = $instance->weekstart;
$weekstarts[].=$weekstart;
}
$dates = array_map('strtotime', $weekstarts);
$startdate = min($dates);
$enddate = strtotime("+7 day", max($dates));
// update start and end date for the course instance
$result = \App\Coursesinstance::where('id', $weekinstance->coursesinstance_id)
->update([
'start_date' => $startdate,
'end_date' => $enddate
]);
});
这是发生问题的地方。 week
已成功创建,weekinstance
已创建,但是上面的update
调用只是未设置{{1}的start_date
和end_date
}}。
我已经在调试器中运行,并且在更新时,一切似乎都很好。创建一个courseinstance
和$startdate
变量作为时间戳,where子句确实返回了课程实例,返回结果为1,因此Laravel不返回任何错误,并且在日志文件中没有任何问题。 $enddate
和start_date
可在模型上填写。一切看起来真的很正常。
答案 0 :(得分:0)
日期字段在MySQL中存储为TIMESTAMP
。它不接受Unix时间戳记作为参数。因此,您必须先将时间戳记转换为正确的格式,然后再进行更新。一种方法:
->update([
'start_date' => Carbon\Carbon::createFromTimestamp($startdate),
'end_date' => Carbon\Carbon::createFromTimestamp($enddate)
]);
答案 1 :(得分:0)
好吧,在花了很多时间之后,我终于意识到问题是我将timestamp
值直接传递给了查询生成器。我几乎不知道MYSQL期望将timestamp
作为日期字符串。我认为数据类型datetime
用于字符串,顾名思义,timestamp
可以用于实际的timestamp
。我知道疯了。
这就是我创建“时间戳”的方法:
$startdate = date('Y-m-d H:i:s',min($dates));
$enddate = date('Y-m-d H:i:s',strtotime("+7 day", max($dates)));
换句话说,与我根据时间戳的定义所认为的逻辑相距180度。
谢谢, 布莱恩