我正在编写一个管理培训课程的Laravel应用程序。
每门课程都由课程模型表示。
一门课程可以有很多日期-它们由CourseDate模型表示,两者之间具有hasMany关系:
每个课程还具有一个“日期模板”,即CourseDate,但设置了“ is_template”布尔值。
我想在Course模型上创建一个访问器,以检索其日期模板。
每个模型的(相关)代码为:
class Course extends Model {
public function getDateTemplateAttribute() {
$dates = $this->dates;
$filtered = $dates->where('is_template', true);
$template = $filtered->first();
return $template;
}
public function dates() {
$result = $this->hasMany( CourseDate::class );
return $result;
}
}
class CourseDate extends Model {
public function course() {
return $this->belongsTo( Course::class );
}
}
然后,在我的控制器中,我有这个:
// this block works absolutely perfectly
$course = Course::find(1);
$dates = $course->dates;
$working_date_template = $dates->where('is_template', true)->first();
// this one doesn't work at all and says "call to a member function first() on array"
$broken_date_template = $course->date_template;
在残破的代码中逐步使用xdebug进行操作,行$dates = $this->dates
返回一个空数组,因此其他所有内容都将中断。
这是Laravel访问器/关系系统的限制吗?还是我只是太笨而做错了事。
答案 0 :(得分:0)
我刚刚解决了这个问题。
我需要在模型本身内使用$this->dates()
,因为这将返回关系,然后可以使用where()
方法和其他查询生成器方法将其过滤掉。
这当然是在Laravel文档中提到的-我只是没有发现它。