You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Eloquent中按状态分组统计各分组的条目数量?

按指定状态统计条目数量(无索引结果)

嘿,我来帮你搞定这个统计需求!你想要针对swappingconfirmedcanceledscheduled这几个状态单独计数,还得去掉返回结果里的数组索引对吧?下面分两种常见数据库场景给你具体的查询写法:

1. SQL数据库(比如MySQL、PostgreSQL)

基础分组统计(返回键值对行)

如果你的工具返回的数组索引是因为结果是多行记录,先写基础的分组查询确保只统计指定状态:

SELECT status, COUNT(*) AS entry_count
FROM your_table_name
WHERE status IN ('swapping', 'confirmed', 'canceled', 'scheduled')
GROUP BY status;

这个查询会返回每行对应一个状态和它的计数,没有多余的索引列。

转成单一对象结果(无数组结构)

如果你的查询工具把结果包装成带索引的数组,想直接拿到键值对形式的对象,可以用JSON聚合函数(以PostgreSQL为例):

SELECT JSON_OBJECT_AGG(status, entry_count) AS status_counts
FROM (
    SELECT status, COUNT(*) AS entry_count
    FROM your_table_name
    WHERE status IN ('swapping', 'confirmed', 'canceled', 'scheduled')
    GROUP BY status
) AS grouped_data;

返回结果会是类似{"swapping":5, "confirmed":12, "canceled":3, "scheduled":8}的JSON对象,完全没有数组索引。

2. MongoDB数据库

用聚合管道先过滤指定状态,再分组计数,最后把结果转成无索引的键值对对象:

db.your_collection_name.aggregate([
    // 第一步:只保留目标状态的记录
    { $match: { status: { $in: ['swapping', 'confirmed', 'canceled', 'scheduled'] } } },
    // 第二步:按状态分组计数
    { $group: { _id: "$status", count: { $sum: 1 } } },
    // 第三步:把分组结果转成键值对数组,再转成对象
    { $group: {
        _id: null,
        status_counts: {
            $arrayToObject: {
                $map: {
                    input: "$$ROOT",
                    as: "item",
                    in: ["$$item._id", "$$item.count"]
                }
            }
        }
    } },
    // 第四步:去掉多余的_id字段
    { $project: { _id: 0 } }
])

最终返回的结果是{ "status_counts": { "swapping": 4, "confirmed": 9, ... } },没有数组索引干扰。

内容的提问来源于stack exchange,提问作者Raul Blosfeld Wohnrath

火山引擎 最新活动