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
相关产品推荐
相关产品推荐

