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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:51:21