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
}
我有 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
}