Laravel中如何查询MySQL JSON列内嵌套对象的数组属性指定值
MySQL 嵌套JSON数组字段查询方案
该需求完全可以实现,你之前的写法错误是因为没有正确指定JSON路径参数。
前置要求
- 你的MySQL版本需要 >= 5.7,且存储目标数据的字段已设置为
JSON类型 JSON_CONTAINS函数为严格类型匹配,查询值的类型需要和JSON中存储的ids元素类型完全一致(数字和字符串不会自动转换)
原生SQL查询写法
如果直接用SQL查询,语法如下:
SELECT * FROM 你的表名 WHERE JSON_CONTAINS(你的JSON字段名, '查询的目标值', '$[*].ids');
以你的示例数据为例,要查询ids包含79的行,对应SQL为:
SELECT * FROM your_table WHERE JSON_CONTAINS(data, '79', '$[*].ids');
其中路径参数$[*].ids的含义是:遍历JSON根节点的所有数组元素,取每个元素的ids字段进行匹配。
Laravel Eloquent 写法
高版本Laravel(支持whereJsonContains第三个参数)
直接通过whereJsonContains的第三个参数指定JSON路径即可:
$targetId = 79; $result = Model::query() ->whereJsonContains('data', $targetId, '$[*].ids') ->first();
低版本Laravel兼容写法
如果你的Laravel版本不支持路径参数,可以用whereRaw直接调用原生JSON函数:
$targetId = 79; $result = Model::query() ->whereRaw('JSON_CONTAINS(data, ?, "$[*].ids")', [$targetId]) ->first();
常见排查点
如果按上述写法依然查询不到结果,可以优先排查以下问题:
- 检查目标字段存储的JSON结构是否合法,有没有多余的转义字符
- 确认查询值的类型和JSON中ids数组的元素类型一致:如果ids存的是字符串数字,查询时需要传入字符串格式的目标值(如
'79') - 检查数据库表对应字段是否确实为
JSON类型,而非text/varchar类型
内容的提问来源于stack exchange,提问作者Mostafa Nobaqi
相关产品推荐
相关产品推荐

