【问题标题】:Eager loading nested relationships急切加载嵌套关系
【发布时间】:2017-11-28 13:34:53
【问题描述】:

对于一个学校平台,我想列出所有在某个学年注册的班级的学生。在这个列表中,我想查看每个学生的 id、last_name、first_name 和班级名称。

Id+全名没问题,但是加载所有关系,显示全类名和等级就不行了。

我的关系如下:

student -> hasMany -> Enrollments
-----------Enrollments -> belongsTo -> offering
--------------------------offering -> belongsTo -> schoolClasses
--------------------------offering -> belongsTo -> schoolyears
--------------------------------------schoolClass -> belongsTo -> grade

班级名称由年级名称+班级名称组成(例如Nursery 1 + A)。

我的 EER 如下:

目前我有这个工作:

通过在我的控制器中执行此操作:

$students = Student::with('offerings.schoolClasses.grades')->get();
return view('student.overview', ['students' =>$students]);

在我看来:

@foreach($students as $student)
<tr>
    <th scope="row">{{$student->id}}</th>
    <td>{{$student->first_name}}</td>
    <td>{{$student->last_name}}</td>
    <td>{{$student->offerings}}</td>
</tr>
@endforeach

有人可以帮我弄到最后的部分吗?

【问题讨论】:

  • 您的 EER 图片丢失 Student 模型。
  • 学生是用户,抱歉我没有提到。学生模型是基于用户模型的模型,但会检查用户是否注册。
  • 我看到注册是一个“加入”表,或者像 Laravel 所说的那样,一个“数据透视”表。您可以使用Laravel documentation on relationships Many to Many 的帮助。你会发现一个类似的案例。

标签: php laravel eloquent


【解决方案1】:

我认为你可以这样尝试:

$students = Student::with('offerings.schoolClasses.grades')
->with(array('offerings.schoolYears'=>function($query){
         $query->where('start', '=', $somedate)
     }))
->get();

你可以试试这个来显示成绩:

{{$student->offerings->schoolClasses->grades->grade}}

【讨论】:

  • 不幸的是这不起作用,似乎学年和学年返回空值。如果我检查我的数据库,似乎有问题的学生的注册与课程和年级的课程相关联。所以通常这应该工作。你知道哪里出了问题吗?
  • 你应该展示更多的代码,比如模型和关系,就像@Anwar_Nairi 指出的那样,注册应该通过用户和产品之间的多对多关系的数据透视表,如果我们看到更多的代码也许可以帮助你。
  • 您确实是正确的,这些关系已经建立,但是我发现在引用关系时必须添加外键。我现在明白了。谢谢你们帮助我:)
【解决方案2】:

我发现出了什么问题,我的模型中的关系定义不包含要引用的外键。

在引用关系时我必须添加显式外键:

public function schoolClass(){
    return $this->belongsTo(SchoolClass::class,'school_class_id');
}

public function schoolyears(){
    return $this->belongsTo(Schoolyear::class,'schoolyear_id');
}

school_class_idschoolyear_id 用于正确加载所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2017-09-30
    • 2015-08-16
    • 2014-09-19
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多