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

Laravel Eloquent查询JSON字段比较返回空结果怎么解决?

问题原因

Laravel查询构造器的where方法默认会把运算符右侧的内容作为值做参数绑定,你写的SQL函数表达式会被转义为字符串,所以生成的预处理SQL里右侧变成了?占位符,导致查询结果为空。之前whereRaw使用报错一般是因为没有把整个比较逻辑都放到原生SQL片段中。


可行实现方案

方案1:完全对齐原生SQL逻辑

$result = DB::table('C')
    ->select(
        'id',
        DB::raw('json_extract(meta,"$.A") as a'),
        DB::raw('json_extract(meta,"$.B") as b')
    )
    ->whereRaw('json_unquote(json_extract(meta, "$.A")) > json_unquote(json_extract(meta,"$.B"))')
    ->get();

方案2:用Laravel内置JSON短语法简化

Laravel支持字段->JSON键的短写法,底层会自动转换为json_unquote(json_extract(字段, '$.JSON键'))的表达式,代码可以简化为:

$result = DB::table('C')
    ->select('id', 'meta->A as a', 'meta->B as b')
    ->whereRaw('meta->A > meta->B')
    ->get();

注意事项

这种两边都是数据库字段/计算表达式的比较,不要把右侧逻辑放到参数绑定的位置,直接全部写在whereRaw的原生SQL片段里即可,不会有SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:57:02