Laravel Eloquent - 如何获得嵌套关系

Posted

技术标签:

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

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

具有以下关系:Competency hasMany ObjectiveObjective 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。有没有办法只输出分数? 【参考方案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

【讨论】:

以上是关于Laravel Eloquent - 如何获得嵌套关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 5.6 在 Laravel Eloquent 中实现嵌套 MySQL 查询

如何在 Laravel/Eloquent 中获得完整的关系

Laravel Eloquent 如何根据计数获得关系总和

laravel Eloquent ORM - 如何获得编译查询?

如何在你已经获得的东西上使用 Laravel Eloquent ::with()?

Laravel 插入嵌套的 Eloquent ORM 模型