Laravel新手求助:如何关联多表并单独查询course1、course2、course3字段
Laravel多字段关联课程表查询解决方案
你的assigncourses表有course1、course2、course3三个字段对应课程ID,要同时获取这三个字段的课程信息,需要多次关联courses表并通过别名区分,以下是两种实现方式:
1. 原生Join方式(适合快速查询)
修改控制器代码,三次关联courses表并指定别名,选择字段时添加别名避免冲突:
$courses = Assigncourse::join('teachers', 'teachers.id', '=', 'assigncourses.teacher_id') // 关联course1对应的课程 ->join('courses as c1', 'c1.id', '=', 'assigncourses.course1') // 关联course2对应的课程 ->join('courses as c2', 'c2.id', '=', 'assigncourses.course2') // 关联course3对应的课程 ->join('courses as c3', 'c3.id', '=', 'assigncourses.course3') ->where('teachers.id', '=', $id) ->select([ 'teachers.name as teacher_name', // course1相关字段 'c1.id as course1_id', 'c1.course_title as course1_title', 'c1.course_code as course1_code', 'c1.course_credit as course1_credit', 'c1.course_type as course1_type', // course2相关字段 'c2.id as course2_id', 'c2.course_title as course2_title', 'c2.course_code as course2_code', 'c2.course_credit as course2_credit', 'c2.course_type as course2_type', // course3相关字段 'c3.id as course3_id', 'c3.course_title as course3_title', 'c3.course_code as course3_code', 'c3.course_credit as course3_credit', 'c3.course_type as course3_type' ]) ->get();
2. Eloquent关联方式(更符合Laravel规范)
在Assigncourse模型中定义关联关系:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Assigncourse extends Model { protected $table = 'assigncourses'; // 关联course1对应的课程 public function course1() { return $this->belongsTo(Course::class, 'course1'); } // 关联course2对应的课程 public function course2() { return $this->belongsTo(Course::class, 'course2'); } // 关联course3对应的课程 public function course3() { return $this->belongsTo(Course::class, 'course3'); } // 关联教师 public function teacher() { return $this->belongsTo(Teacher::class); } }
控制器中使用预加载获取关联数据:
$assignCourses = Assigncourse::with(['teacher', 'course1', 'course2', 'course3']) ->where('teacher_id', $id) ->get();
视图中可直接通过对象属性访问数据,示例:
@foreach($assignCourses as $item) <p>教师:{{ $item->teacher->name }}</p> <p>课程1:{{ $item->course1->course_title }}({{ $item->course1->course_code }})</p> <p>课程2:{{ $item->course2->course_title }}({{ $item->course2->course_code }})</p> <p>课程3:{{ $item->course3->course_title }}({{ $item->course3->course_code }})</p> @endforeach
内容的提问来源于stack exchange,提问作者1641_Shourav Chy
相关产品推荐
相关产品推荐

