Laravel使用with与whereHas多表关联查询 筛选指定姓名所属完整档案组
问题排查与解决方法
原有写法错误原因
- 第一种写法:
- 首行查询全量档案数据,无过滤逻辑性能极低
- 第二行仅取出查询结果中第一个档案的人员关联,且额外添加了姓氏过滤条件,最终仅能返回单条匹配的人员记录,完全不符合需求
- 第二种写法:
仅通过whereHas筛选出了包含匹配姓氏人员的档案,但没有加载对应的人员关联;即使额外加关联加载逻辑,若在关联查询中添加过滤条件,也只会返回匹配的单条人员,无法拿到同档案下所有人员
正确实现代码
方案1:返回带人员关联的档案集合
如果需要保留档案层级结构,同时带出对应档案的全部人员,使用以下写法:
$fascicoli = Fascicoli::whereHas('person', function ($sub) use ($query) { $sub->where('cognome', 'like', '%' . $query . '%'); })->with('person')->get();
执行逻辑:
whereHas负责筛选出包含符合姓氏搜索条件人员的所有档案with('person')负责预加载上述筛选出来的档案的全部人员关联,不会添加额外过滤条件,因此可以拿到同档案下所有人员
方案2:直接返回扁平化的人员集合
如果不需要外层档案结构,直接返回所有符合要求的人员记录,使用以下写法:
$people = Fascicoli::whereHas('person', function ($sub) use ($query) { $sub->where('cognome', 'like', '%' . $query . '%'); })->get() ->pluck('person') ->flatten();
以你给出的示例搜索%Del%为例,上述代码会返回Urbano、Del Mastro两条人员记录,完全符合需求。
内容的提问来源于stack exchange,提问作者Matteo Del Mastro
相关产品推荐
相关产品推荐

