我试图了解一些观察到的行为,这些行为对我来说没有意义。
我仅出于演示行为的目的,设置了以下一些人为设计的表和数据。
id名称
1个鲍勃
2克莱尔
3吉姆
4玛丽
hasMany('App \ Score') hasMany('App \ Guardian')
id学生ID名称
1 1爸爸鲍勃
2 1鲍勃妈妈
3 3吉姆妈妈
4 4玛丽斯妈妈
5 4玛丽斯爸爸
belongsTo('App \ Student')
id student_id分数
1 3 75
2 4 100
belongsTo('App \ Student')
以刀片视图浏览所有学生并输出相关的监护人,按预期进行。
$students = \App\Student::orderBy('students.name')->get();
但是,当我向分数表添加左联接时,监护人仅在分数表中具有相关记录的第一条记录之前显示,并且它们始终是表中第一组监护人(即Bob的监护人)。 / p>
$studentsleftjoin = \App\Student::leftJoin('scores', function($join) {
$join->on('students.id', '=', "scores.student_id");
})
->orderBy('students.name')
->get();
无论左联接如何,我都希望得到相同的结果。
请帮助我了解我在做什么错。
如果我的解释不清楚,请原谅我。我创建了一个github repo,所以您可以在本地重新创建该问题。
在此先感谢您的帮助。
内华达州。
[更新:根据请求添加视图代码]
<h2>Without join</h2>
@foreach($students as $student)
<strong>{{$student->name}} - Guardians: </strong> <ul>
@foreach($student->guardians as $guardian)
<li>{{$guardian['name']}}</li>
@endforeach
</ul>
@endforeach
<h2>With left join</h2>
@foreach($studentsleftjoin as $studentleftjoin)
<strong>{{$studentleftjoin->name}} - Guardians:</strong> <ul>
@foreach($studentleftjoin->guardians as $guardianleftjoin)
<li>{{$guardianleftjoin['name']}}</li>
@endforeach
</ul>
@endforeach
答案 0 :(得分:0)
您的左联接仅产生scores
表数据,因此您需要以雄辩的方式指定分组。
添加group_by
$studentsleftjoin = \App\Student::leftJoin('scores', function($join) {
$join->on('students.id', '=', "scores.student_id");
})
->orderBy('students.name')
->groupBy('students.id')
->get();