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

Laravel操作MySQL提取分组统计数据并传递到Blade模板的问题

问题排查与解决方案

现有写法问题分析

第一种写法

原生SQL查询的基础逻辑成立,但存在两处待优化/缺失的点:

  • 未给COUNT(*)统计结果设置别名,后续在模板中读取计数数据时会非常不便
  • 没有加入需求中隐含的data_zgloszenia非空、匹配user_id的筛选条件,如果实际业务需要这两个限制,需要补充到SQL语句中

第二种写法

该写法无法得到分组统计结果,核心问题有两个:

  • 末尾调用count()方法会直接返回整个查询结果的总条数,覆盖了前面的groupBy分组逻辑,最终只能拿到单个数字
  • select字段仅包含设备编号,没有加入计数统计的字段,就算去掉末尾的count(),也只能拿到去重后的设备编号列表,没有对应的故障次数数据

正确实现代码

1. 查询构造器写法(推荐)

$machineFaultCounts = DB::table('awaries')
    ->select('numer_maszyny', DB::raw('COUNT(*) as fault_count'))
    ->whereNotNull('data_zgloszenia') // Laravel内置方法,比手写`!= null`更规范,避免SQL模式兼容问题
    ->where('user_id', $user_id)
    ->groupBy('numer_maszyny')
    ->get();

如果业务需求不需要限制user_id,也不需要校验data_zgloszenia是否为空,直接删掉对应的where条件即可。

2. 原生SQL写法(和第一种写法对齐,补充优化点)

$machineFaultCounts = DB::select(DB::raw(
    "SELECT numer_maszyny, COUNT(*) as fault_count 
    FROM `awaries` 
    WHERE data_zgloszenia IS NOT NULL AND user_id = ? 
    GROUP BY numer_maszyny"
), [$user_id]);

用参数绑定的方式传入user_id可以避免SQL注入风险。

数据传递到Blade模板展示

控制器中将查询结果传递到视图:

return view('你的视图路径', compact('machineFaultCounts'));

Blade模板中遍历展示:

<div class="fault-statistics">
    @foreach($machineFaultCounts as $stat)
        <p>设备名{{ $stat->numer_maszyny }},出现次数{{ $stat->fault_count }}</p>
    @endforeach
</div>

即可得到你需要的展示效果。

内容的提问来源于stack exchange,提问作者Hubert Gościniak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:06:00