在雄辩的访问者中使用雄辩的关系?

时间:2019-06-11 11:13:33

标签: laravel-5 eloquent relationship accessor

我正在编写一个管理培训课程的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访问器/关系系统的限制吗?还是我只是太笨而做错了事。

1 个答案:

答案 0 :(得分:0)

我刚刚解决了这个问题。

我需要在模型本身内使用$this->dates(),因为这将返回关系,然后可以使用where()方法和其他查询生成器方法将其过滤掉。

这当然是在Laravel文档中提到的-我只是没有发现它。