Laravel多对多关联中获取同外键多条记录的问题
解决多对多关联中同外键多条记录无法获取的问题
1. 修正模型关联的外键顺序
多对多关联belongsToMany的参数顺序为:关联模型类名、中间表名、当前模型在中间表的外键、关联模型在中间表的外键。你的Teacher模型关联外键写反,导致关联关系错误,无法正确匹配中间表记录。
修正后的模型代码:
public function courses(): BelongsToMany { return $this->belongsToMany(Course::class, 'workloads', 'teacher_id', 'course_id') ->withPivot('id'); // 若需获取中间表的额外字段(如记录ID),添加此方法 }
2. 调整控制器查询逻辑
确保查询时关联关系正确,若需指定关联字段,必须包含关联模型的主键:
// 获取所有教师及对应关联课程(包含中间表所有记录) $teachers = Teacher::with('courses')->get(['id', 'name']); // 若需指定courses字段,需包含主键id // $teachers = Teacher::with('courses:id,courseName')->get(['id', 'name']);
3. 视图展示教师及对应课程
若要展示每个教师的所有分配课程,需嵌套遍历关联的课程数据:
@foreach ($teachers as $teacher) <div> <h4>{{ __($teacher->name) }}</h4> <p>分配课程:</p> <ul> @foreach ($teacher->courses as $course) <li>{{ __($course->courseName) }}(中间表记录ID:{{ $course->pivot->id }})</li> @endforeach </ul> </div> @endforeach
如果需要展示中间表的每一条关联记录(包含重复教师的不同课程分配),可直接查询中间表并关联教师和课程:
控制器代码
$workloads = DB::table('workloads') ->join('teachers', 'workloads.teacher_id', '=', 'teachers.id') ->join('courses', 'workloads.course_id', '=', 'courses.id') ->select('workloads.id', 'teachers.id as teacher_id', 'teachers.name', 'courses.courseName') ->get();
视图代码
@foreach ($workloads as $item) <option value="{{ $item->teacher_id }}">{{ __($item->name) }} - {{ __($item->courseName) }}</option> @endforeach
内容的提问来源于stack exchange,提问作者Arsalan Khan
相关产品推荐
相关产品推荐

