Laravel 10中whereHas与orWhere组合查询adjustment_number失效问题
Laravel 查询中orWhere失效问题排查与解决
问题描述
我创建了adjustment表,包含id、adjustment_number、status字段,该表与materialloc和sbin存在关联关系。使用Laravel 10编写了如下查询代码:
$query = Adjustment::with('materialloc.sbin'); if ($request->has('search') && $request->input('search')) { $searchTerm = $request->input('search'); $query->whereHas('materialloc.sbin', function ($query) use ($searchTerm) { $query->where('name', 'like', '%' . $searchTerm . '%'); }); $query->orWhere('adjustment_number', 'like', '%' . $searchTerm . '%'); }
目前通过materialloc.sbin的name字段搜索正常,但adjustment_number搜索不生效,请问是否是whereHas、where或orWhere的使用存在错误?
问题原因与解决方案
问题出在条件逻辑的分组上。当前代码生成的SQL逻辑是:
WHERE EXISTS(关联sbin的name匹配条件) OR adjustment_number LIKE '%搜索词%'
看似逻辑没问题,但SQL中AND优先级高于OR,如果后续添加其他where条件(比如筛选status),会直接破坏原有搜索逻辑;即使当前没有额外条件,也可能因为查询构造器的拼接顺序,导致orWhere未按预期生效。
正确的写法是将两个搜索条件包裹在同一个where闭包内,明确表示“满足关联sbin的name匹配 或者 adjustment_number匹配”:
$query = Adjustment::with('materialloc.sbin'); if ($request->has('search') && $request->input('search')) { $searchTerm = $request->input('search'); $query->where(function ($q) use ($searchTerm) { $q->whereHas('materialloc.sbin', function ($subQuery) use ($searchTerm) { $subQuery->where('name', 'like', '%' . $searchTerm . '%'); })->orWhere('adjustment_number', 'like', '%' . $searchTerm . '%'); }); }
这样生成的SQL会自动为两个条件添加括号分组,确保逻辑绝对正确:
WHERE (EXISTS(关联sbin的name匹配条件) OR adjustment_number LIKE '%搜索词%')
额外排查点
如果调整后仍不生效,可以检查以下内容:
- 确认
adjustment表的adjustment_number字段名称与代码中完全一致,无拼写错误 - 确认搜索内容确实存在于
adjustment_number字段中(注意数据库的大小写敏感配置) - 若
adjustment_number是数值类型,确保搜索词格式匹配(避免带非数字字符)
内容的提问来源于stack exchange,提问作者Muttaqin
相关产品推荐
相关产品推荐

