You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:53:18