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

Laravel9中AND/OR组合查询结果不符 如何正确编写Eloquent语句

问题原因

你写的代码和原生SQL逻辑不符,核心有3个错误:

  • 缺失原生SQL中COLUMN1 = 'DATA'的强制过滤条件,原SQL逻辑是必须先满足COLUMN1等于指定值,再匹配括号内的三个OR条件,你当前代码完全省略了这层判断,会返回所有满足括号内条件的记录,和原逻辑偏差极大。
  • 模糊查询参数未拼接通配符,原SQL中LIKE 'K%'是前缀匹配规则,你直接传入$request->data没有追加%后缀,实际执行的是完全等值匹配,模糊查询根本不生效。
  • 原SQL三个OR条件的匹配规则不一致:column2、column3是前缀模糊匹配,column4是完全等值匹配,你把同一个参数无差别套给三个条件,本身就不符合原SQL的匹配逻辑。
正确实现代码(Laravel 9 框架)
// 提前处理参数,注意做好参数校验避免注入风险
$likePrefix = $request->input('match_key') . '%'; // 拼接前缀匹配通配符,比如传入K就生成K%
$exactEmail = $request->input('match_email'); // 对应column4的等值匹配值,比如ABC@GMAIL.COM

DB::table('table1')
    ->where('column1', '=', 'DATA') // 先加全局必须满足的COLUMN1过滤条件
    ->where(function ($query) use ($likePrefix, $exactEmail) {
        // 闭包内写括号包裹的OR条件,自动保证SQL优先级正确
        $query->where('column2', 'LIKE', $likePrefix)
              ->orWhere('column3', 'LIKE', $likePrefix)
              ->orWhere('column4', '=', $exactEmail);
    })
    ->get();
生成SQL对照

上述代码最终生成的原生SQL和你预期的逻辑完全一致,绑定参数会自动做PDO预处理防注入:

select * from `table1` where `column1` = ? and (`column2` LIKE ? or `column3` LIKE ? or `column4` = ?)

实际绑定参数依次为:'DATA'、'K%'、'K%'、'ABC@GMAIL.COM'

内容的提问来源于stack exchange,提问作者Hadem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:39:54