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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:07:03