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

如何在JSON数组类型列中使用操作符进行查询?

解决JSON数组列的bedrooms_count范围查询问题

你的detail列存储的是JSON数组,而非单个JSON对象,直接使用->where('detail->bedrooms_count', '>=', 1)->where('detail->bedrooms_count', '<=', 5)的写法无法遍历数组内的元素,因此查询返回空结果。以下是针对不同MySQL版本的可行解决方案:

方案一:MySQL 8.0+ 推荐写法(支持任意数值范围)

利用JSON_TABLE函数将JSON数组展开为临时表,再检查是否存在符合条件的元素:

->whereExists(function ($query) {
    $query->select(DB::raw(1))
          ->fromRaw('JSON_TABLE(detail, "$[*]" COLUMNS (bedrooms_count INT PATH "$.bedrooms_count")) AS jt')
          ->whereBetween('jt.bedrooms_count', [1, 5]);
})

方案二:兼容低版本MySQL(仅适用于小范围整数)

如果你的MySQL版本低于8.0,可通过JSON_CONTAINS逐个匹配范围内的整数值:

->whereRaw('JSON_CONTAINS(detail, \'{"bedrooms_count": 1}\', "$[*]") 
    OR JSON_CONTAINS(detail, \'{"bedrooms_count": 2}\', "$[*]") 
    OR JSON_CONTAINS(detail, \'{"bedrooms_count": 3}\', "$[*]") 
    OR JSON_CONTAINS(detail, \'{"bedrooms_count": 4}\', "$[*]") 
    OR JSON_CONTAINS(detail, \'{"bedrooms_count": 5}\', "$[*]")')

方案三:使用原生JSON函数做范围检查

通过JSON_EXTRACT提取所有bedrooms_count值,再用正则匹配范围(仅适用于整数场景):

->whereRaw('JSON_EXTRACT(detail, "$[*].bedrooms_count") REGEXP "[1-5]"')

内容的提问来源于stack exchange,提问作者Naung Ye Htet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:16:08