Laravel左联接在访问相关模型时会导致意外结果

时间:2018-11-27 06:44:02

标签: laravel eloquent query-builder

我试图了解一些观察到的行为,这些行为对我来说没有意义。

我仅出于演示行为的目的,设置了以下一些人为设计的表和数据。

表格:学生

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();

without join

但是,当我向分数表添加左联接时,监护人仅在分数表中具有相关记录的第一条记录之前显示,并且它们始终是表中第一组监护人(即Bob的监护人)。 / p>

$studentsleftjoin = \App\Student::leftJoin('scores', function($join) {
        $join->on('students.id', '=', "scores.student_id");
    })
    ->orderBy('students.name')
    ->get();

with left join

无论左联接如何,我都希望得到相同的结果。

请帮助我了解我在做什么错。

如果我的解释不清楚,请原谅我。我创建了一个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

1 个答案:

答案 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();