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

Laravel 9中如何正确查询JSON列内的JSON对象?

解决Laravel 9中JSON数组列的对象属性筛选问题

针对你在Laravel 9中查询JSON数组列里包含特定job_type的Client记录的问题,以下是两种无需创建中间表的解决方案:

方法一:正确使用whereJsonContains

你的job_type_rates列存储的是JSON数组,每个元素是包含job_type字段的对象,之前的写法whereJsonContains('job_type_rates->job_type', "8")不适用这种场景。正确的用法是传递一个匹配的键值对数组,让Laravel查找数组中是否存在符合条件的对象:

Client::whereJsonContains('job_type_rates', ['job_type' => '8'])->get();

如果需要严格匹配数据类型(比如数据库中job_type存储为字符串,避免和整数混淆),Laravel 9+支持添加第三个参数指定类型:

Client::whereJsonContains('job_type_rates', ['job_type' => '8'], 'string')->get();

方法二:使用whereRaw结合数据库JSON函数

如果需要更灵活的查询逻辑,可以直接调用数据库的JSON函数(以MySQL为例),用JSON_SEARCH查找目标属性值是否存在:

Client::whereRaw('JSON_SEARCH(job_type_rates, "one", "8", null, "$[*].job_type") IS NOT NULL')->get();

JSON_SEARCH的参数说明:

  • 第一个参数:目标JSON列名
  • 第二个参数:"one"表示找到第一个匹配项即停止,"all"表示查找所有
  • 第三个参数:要匹配的值
  • 第四个参数:匹配路径的前缀(这里设为null)
  • 第五个参数:指定要查找的属性路径$[*].job_type,表示数组中所有元素的job_type字段

如果查询结果非空,说明该记录的job_type_rates数组中存在job_type为"8"的对象。

内容的提问来源于stack exchange,提问作者Andy Holmes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:01:15