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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:18:10