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

Laravel 9升级至10后所有whereRaw查询均报错问题排查

问题原因及解决方案

核心原因

Laravel 10 对 whereRaw 方法的参数校验做了严格升级:

  • 在 Laravel 9 及更早版本,框架会隐式将 Illuminate\Database\Query\Expression(即DB::raw()返回的对象)转换为字符串,允许直接把DB::raw()结果传给whereRaw的第一个参数。
  • Laravel 10 移除了这个隐式转换逻辑,whereRaw的第一个参数要求必须是纯字符串SQL片段,当传入Expression对象时,框架无法完成类型转换,就会抛出你看到的异常(对应Grammar.php中处理SQL字符串的逻辑无法识别Expression对象)。

错误用法示例(Laravel9兼容,Laravel10报错)

// 错误:将DB::raw()的Expression对象直接传给whereRaw
Model::whereRaw(DB::raw('created_at > NOW() - INTERVAL 7 DAY'))->get();

修正方案

根据场景选择以下任意一种:

  • 直接传入字符串SQL片段(推荐,符合whereRaw的设计初衷):
    Model::whereRaw('created_at > NOW() - INTERVAL 7 DAY')->get();
    
  • 如果确实需要使用DB::raw(),改用where方法替代whereRaw:
    Model::where(DB::raw('created_at > NOW() - INTERVAL 7 DAY'))->get();
    
  • 若SQL包含占位符,将动态逻辑作为绑定值传入(如果适用):
    Model::whereRaw('created_at > NOW() - INTERVAL ? DAY', [7])->get();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:03:12