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 ORM - 如何获得编译查询?