Laravel中查询key为alert_daily_report且JSON值含至少一个true的数据问题
Laravel 键值存储表JSON字段查询方案
你的问题核心是要筛选key为alert_daily_report,且对应JSON字段(假设字段名为value)中至少有一个属性值为true的记录,之前用whereJsonContains的思路不对——这个方法是用来匹配JSON数组的,而你的值是JSON对象,以下是两种场景的解决方案:
1. 已知JSON对象的属性名(如固定为sms、email)
直接通过分组OR条件判断指定属性的值:
DB::table('my_table') ->where('key', 'alert_daily_report') ->where(function ($query) { $query->whereJson('value->sms', true) ->orWhereJson('value->email', true); }) ->get();
逻辑:先筛选出key匹配的记录,再判断sms或email任意一个为true。
2. 未知JSON对象的属性名(属性不固定)
如果JSON中的属性不确定,可以用原生SQL来检查所有属性值中是否存在true:
适用于MySQL 8.0.17+版本
DB::table('my_table') ->where('key', 'alert_daily_report') ->whereRaw('JSON_CONTAINS_ANY(JSON_VALUES(value), CAST("[true]" AS JSON))') ->get();
JSON_VALUES(value)会提取JSON对象的所有值生成数组,JSON_CONTAINS_ANY检查数组是否包含true。
适用于低版本MySQL
DB::table('my_table') ->where('key', 'alert_daily_report') ->whereRaw('EXISTS (SELECT 1 FROM JSON_TABLE(JSON_KEYS(value), "$[*]" COLUMNS(key_name VARCHAR(255) PATH "$")) AS jt WHERE JSON_EXTRACT(value, CONCAT("$.", jt.key_name)) = true)') ->get();
通过JSON_KEYS获取所有属性名,再逐个检查属性值是否为true。
内容的提问来源于stack exchange,提问作者ERASH
相关产品推荐
相关产品推荐

