Laravel多对多关联查询指定字段并在Blade视图展示
Laravel多对多关联指定字段查询实现方案
你现有代码存在3个核心问题导致需求无法落地:
- 预加载关联名笔误:模型中定义的多对多关联方法为
courses(复数),控制器中写的是with('course'),关联无法正常加载 - 指定字段查询漏带主键:多对多关联需要依靠主表、关联表的主键做中间表匹配,手动
select字段时漏写主键会直接导致关联数据匹配失败 - 视图取值逻辑错误:多对多关联返回的是课程集合对象,直接读取
course_name属性无法拿到对应数据
1. 修正控制器查询逻辑
查询时主表必须携带主键id,关联表也只查询必需的主键和课程名字段,避免拉取全量冗余字段:
public function show() { $data = employ::with(['courses' => function($query) { // 关联课程表仅查询id(关联匹配必需)、课程名字段 $query->select('id', 'course_name'); }]) // 员工表查询字段必须包含主键id,再加你需要的业务字段,注意字段名和表结构完全一致 ->select('id', 'Full_name', 'emp_no', 'salary') ->get(); return view('teacher.teacher_data', compact('data')); }
2. 修正Blade视图渲染逻辑
因为一个员工可能关联多门课程,直接取集合属性拿不到值,把关联课程的名称拼接后展示即可:
<table border="1"> <tr> <th>Full name</th> <th>Emp no</th> <th>salary</th> <th>course</th> </tr> @foreach($data as $item) <tr> <td>{{ $item->Full_name }}</td> <td>{{ $item->emp_no }}</td> <td>{{ $item->salary }}</td> <td>{{ $item->courses->pluck('course_name')->implode(', ') }}</td> </tr> @endforeach </table>
额外注意事项
- 你当前创建的
employcourse中间表模型在无特殊中间表业务逻辑时可以删除,Laravel的belongsToMany关联默认不需要单独创建中间表模型 - 建议模型类名遵循PSR规范和Laravel约定使用大驼峰命名(
Employ、Course),你当前小写开头的类名虽然可以运行,但不符合框架约定,后续维护容易出现类名加载错误 - Eloquent查询返回的结果默认是对象实例,用
->属性访问的方式比数组访问更规范,避免后续模型配置调整时出现取值错误
内容的提问来源于stack exchange,提问作者Ahmad Chohan
相关产品推荐
相关产品推荐

