Laravel带关联关系的查询结果如何按指定关联部门筛选?
问题根因
你定义的scopeDepartment方法中直接查询dept_no字段无法生效,是因为dept_no不属于employees主表的字段,而是存放在多对多关联的中间表dept_emp中,直接对主表查询该字段自然匹配不到结果。
正确实现方案
Laravel 中针对关联关系的存在性筛选,需要使用whereHas方法,修改你的scope代码如下:
public function scopeOfDepartment($query, $departmentNo) { return $query->whereHas('departments', function ($subQuery) use ($departmentNo) { $subQuery->where('dept_no', $departmentNo); }); }
调用方式
控制器中直接链式调用该scope即可,预加载关联的逻辑不需要修改:
// 替换为实际要筛选的部门编号 $targetDeptNo = 'd001'; $employees = Employee::with('departments') ->ofDepartment($targetDeptNo) ->paginate(50);
可选优化:预加载结果同步筛选
如果你不需要返回员工关联的其他部门数据,只需要保留当前筛选的部门信息,可以同步给with方法增加筛选条件,减少返回的冗余数据:
$targetDeptNo = 'd001'; $employees = Employee::with(['departments' => function ($subQuery) use ($targetDeptNo) { $subQuery->where('dept_no', $targetDeptNo); }]) ->ofDepartment($targetDeptNo) ->paginate(50);
内容的提问来源于stack exchange,提问作者Djozeph
相关产品推荐
相关产品推荐

