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

Laravel使用with与whereHas多表关联查询 筛选指定姓名所属完整档案组

问题排查与解决方法

原有写法错误原因

  • 第一种写法:
    1. 首行查询全量档案数据,无过滤逻辑性能极低
    2. 第二行仅取出查询结果中第一个档案的人员关联,且额外添加了姓氏过滤条件,最终仅能返回单条匹配的人员记录,完全不符合需求
  • 第二种写法:
    仅通过whereHas筛选出了包含匹配姓氏人员的档案,但没有加载对应的人员关联;即使额外加关联加载逻辑,若在关联查询中添加过滤条件,也只会返回匹配的单条人员,无法拿到同档案下所有人员

正确实现代码

方案1:返回带人员关联的档案集合

如果需要保留档案层级结构,同时带出对应档案的全部人员,使用以下写法:

$fascicoli = Fascicoli::whereHas('person', function ($sub) use ($query) {
    $sub->where('cognome', 'like', '%' . $query . '%');
})->with('person')->get();

执行逻辑:

  1. whereHas 负责筛选出包含符合姓氏搜索条件人员的所有档案
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:06:05