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

