【问题标题】:Laravel Eloquent - How to get nested relationshipLaravel Eloquent - 如何获得嵌套关系
【发布时间】:2020-04-04 22:32:17
【问题描述】:

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

具有以下关系:
Competency hasMany Objective
Objective hasMany 评级目标 属于 能力
评级 belongsTo 目标评分 belongsTo 教师
教师 hasMany 评分

表格:
能力:id、职称等
目标:id、职称、能力ID等[能力ID作为能力的外键]
评级:id、score、objective_id、teacher_id 等 [objective_id 和 teacher_id 作为 FK]
teachers:id、first_name、last_name 等

问题

我想返回所有教师,以及他们按能力和目标分组的评分,例如:

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

我可以获得按目标分组的所有能力,并将其评为:
能力::with('objectives.ratings')->get();

我如何将教师作为第一级:教师 - 能力 - 目标 - 评分?

【问题讨论】:

  • 非常感谢凯文 - 这行得通。只有一件事:在打印分数时,内爆函数也会打印目标的 id。有没有办法只输出分数?

标签: laravel eloquent relationship eager-loading


【解决方案1】:

我能想到的一个捷径是在教师和目标之间建立多对多关系,使用评级作为数据透视表。所以师资和能力的距离就短了一点。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2017-12-13
    • 2021-08-11
    相关资源
    最近更新 更多