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
相关产品推荐
相关产品推荐

