Laravel - 3 个模型有很多关系

Laravel - 3 Models with many relationship

我有 3 个 tables/models 并且想在 one->toMany->toMany 中收集输出。我想从输出中的 3 个 table 中的每一个获取数据。我试过 hasManyThrough,但这给了我第一个也是最后一个 table 关系。我想让中间(通过)table也输出

型号:

student
 - id
 - name

course
 - id
 - student_id
 - name

level
 - id
 - course_id
 - level

我希望输出在一个 array/multidimensional 数组中,如下所示:

student1 -> english -> 101
         -> history -> 104
                    -> 105

student2 -> english -> 201
                    -> 203
         -> history -> 202
         -> math -> 101

student3 -> english -> 302
         -> math -> 200
                 -> 201
         -> science -> 102

然后我可以遍历数组并像上面一样适当地转储它。 hasManyThrough 似乎没有给我课程,只是 student1 -> 201 输出。

hasManyThrough 看起来像这样:

public function courselevels()
    {
        return $this->hasManyThrough('App\Models\Level',
                                     'App\Models\Course',
                                     'student_id',
                                     'course_id',
                                     'id',
                                     'id');

    }

我也试过像这样的普通查询构建器:

$userSoftware = DB::table('student')
    ->join('course', 'course.student_id', '=', 'student.id')
    ->join('level', 'level.course_id', '=', 'course.id')
    ->select('course.display_name', 'level.*')
    ->get();

这在一定程度上有效,但我对返回的每个数组元素都有重复项:

student1 -> english -> 101
student1 -> history -> 104
student1 -> history -> 105

student2 -> english -> 201
student2 -> english -> 203
student2 -> history -> 202
student2 -> math -> 101

student3 -> english -> 302
student3 -> math -> 200
student3 -> math -> 201
student3 -> science -> 102

我可以使用 Eloquent 模型和 hasThroughMany 设置,或者在控制器上使用普通查询构建器。

在 Student 模型中,你应该有一个 courses() 关系,在 Course 模型中,你应该有一个 levels() 关系。 然后,当您需要使用 with('courses.levels').

查询所有数据时
// student model
public function courses()
{
    return $this->hasMany(Course::class);
}

// Course model
public function levels()
{
    return $this->hasMany(Level::class);
}

$student = Student::with('courses.levels')->get();

// loop through courses
foreach ( $student->courses as $course ) {
  
  // $course->levels
}