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

