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

Laravel中使用ConsoleTVs/Charts实现动态环形图遇问题

解决ConsoleTVs/Charts环形图动态标签与数值统计问题

嘿,我来帮你搞定这个带动态标签的环形图需求!根据你的描述,我们需要先把用户按provider字段分组(空值替换为"Site"),再把统计好的数据传给Charts组件。下面分两种实现方式来讲解:

方式一:用Laravel集合处理数据(灵活易读)

先获取所有用户,再通过集合的分组方法处理标签和统计数量:

// 1. 获取所有用户
$users = User::all();

// 2. 按处理后的标签分组:空provider替换为"Site"
$groupedData = $users->groupBy(function ($user) {
    // 兼顾provider为null或空字符串的情况
    return empty($user->provider) ? 'Site' : $user->provider;
});

// 3. 转换为「标签 => 数量」的数组
$chartLabels = $groupedData->keys()->toArray();
$chartValues = $groupedData->map(fn($group) => $group->count())->toArray();

// 4. 生成环形图
$providerUsers = Charts::create('donut', 'morris')
    ->title('用户登录来源分布')
    ->labels($chartLabels)
    ->values($chartValues)
    ->colors(['#2c3e50', '#3498db', '#e74c3c', '#2ecc71']) // 自定义环形图颜色
    ->responsive(true); // 适配移动端

方式二:直接在数据库查询中处理(性能更优)

如果用户量较大,直接在数据库层面分组统计会更高效,用CASE语句处理标签:

// 1. 数据库查询:分组并处理标签
$stats = User::selectRaw("
    CASE 
        WHEN provider IS NULL OR provider = '' THEN 'Site' 
        ELSE provider 
    END AS provider_label,
    COUNT(*) AS user_count
")
->groupBy('provider_label')
->get();

// 2. 提取标签和数值数组
$chartLabels = $stats->pluck('provider_label')->toArray();
$chartValues = $stats->pluck('user_count')->toArray();

// 3. 生成环形图
$providerUsers = Charts::create('donut', 'morris')
    ->title('用户登录来源分布')
    ->labels($chartLabels)
    ->values($chartValues)
    ->responsive(true);

注意点

  • 要确保provider字段的空值判断覆盖null和空字符串两种情况,避免统计遗漏
  • 如果需要自定义环形图的颜色、标题等样式,直接在->colors()、->title()方法里调整即可
  • 两种方式都能实现需求,小数据量用集合处理更灵活,大数据量建议用数据库查询提升性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:35:01