如何使用Laravel Eloquent编写原生SQL(解决whereRaw特殊字符报错)
实现方案
之前用whereRaw直接拼接正则语句触发报错,核心原因是正则中的反斜杠、特殊符号在SQL字符串拼接时会被错误转义,同时直接拼接参数存在SQL注入风险,用参数绑定或者Eloquent内置方法即可解决。
方案1:兼容所有Laravel版本的参数绑定写法
把正则表达式作为绑定参数传入whereRaw,PDO会自动处理特殊字符转义,id条件直接调用Eloquent内置的where方法构建,完全避免特殊字符问题:
// 替换为你实际需要匹配的id值 $targetId = 你要查询的id值; $orders = Order::select('id', 'shipping_email') ->whereRaw( 'shipping_email NOT REGEXP ?', ['^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$'] ) // 如果是id不等于的判断,改为 ->where('id', '<>', $targetId) 即可 ->where('id', $targetId) ->get();
方案2:Laravel 9+ 内置正则查询方法(更简洁)
Laravel 9及以上版本的查询构造器已经内置whereNotRegexp方法,不需要手动写原生片段,框架会自动处理转义:
$targetId = 你要查询的id值; $orders = Order::select('id', 'shipping_email') ->whereNotRegexp( 'shipping_email', '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$' ) ->where('id', $targetId) ->get();
注意事项
- 原SQL中
id = '<>'属于占位写法,实际使用时根据业务需求调整id判断逻辑即可,所有动态参数都不要直接拼接进SQL语句,通过参数绑定传入可以同时避免转义错误和SQL注入风险。 - 不要直接把正则字符串写在
whereRaw的SQL语句片段中,正则里的\等特殊字符如果直接拼接,会被PHP或SQL解析器提前转义,导致正则匹配失效或者SQL语法报错。
内容的提问来源于stack exchange,提问作者Shakeel Ahmed
相关产品推荐
相关产品推荐

