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

