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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:39:02