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

