Laravel Eloquent - 如何获取嵌套关系

Laravel Eloquent - How to get nested relationship

我有模型:能力、Objective、评级和教师

具有以下关系:
能力 有很多 Objective
Objective 有很多 评级, Objective 属于 能力
评级 属于 Objective, 评级 属于 老师
老师 有很多 评分

表:
能力:身份证、头衔等
objectives: id, title, competency_id, 等等 [competency_id 作为能力的 FK]
ratings: id, score, objective_id, teacher_id, etc [objective_id and teacher_id as FKs]
教师:id,first_name,last_name,等等

问题

我想 return 所有教师的评分按能力分组,objective如:

teacher1  
-- competency1  
---- objective1 score  
---- objective2 score  
-- competency2  
---- objective1 score  
---- objective2 score  
teacher2  
-- competency1  
---- objective1 score  
---- objective2 score  
-- competency2  
---- objective1 score  
---- objective2 score

我可以获得按 objective 分组的所有能力,并且评级为:
Competency::with('objectives.ratings')->get();

如何让教师成为第一级:教师 - 能力 - objectives - 评级?

我能想到的一个捷径是在教师和目标之间建立多对多关系,使用评分作为支点table。所以老师和能力的距离就近了一点。

class Teacher
{
    public function objectives()
    {
        return $this->belongsToMany(Objective::class, 'ratings');
    }
}

稍后,您可以通过以下方式获取所有数据:

    $teachers = Teacher::with('objectives.competency', 'objectives.ratings')->get();

从视图中,您可以执行以下操作:

@foreach($teachers as $teacher)
    <h1>{{$teacher->first_name}} {{$teacher->last_name}}</h1>
    @foreach($teacher->objectives->groupBy('competency_id') as $groupedObjectives)
        <h2>Competency: {{$groupedObjecttives->first()->competency->title}}</h2>
        @foreach($groupedObjectives as $objective)
            <p>{{$objective->title}}: {{$objective->ratings->implode('score', ', ')}}</p>
        @endforeach
    @endforeach
@endforeach