Laravel关联查询后按省份统计项目数量并传递至视图
按省份统计项目数量并传递至视图的优化实现
Hey,我看你想要实现按省份统计关联后的项目数量,还要把省份名称和对应统计结果以数组形式传给视图。你的现有代码虽然能跑,但存在多次查询数据库、返回数据格式不符合需求的问题,这里给你优化一下:
优化后的完整代码
public function filterByProvince(Request $request) { // 处理请求中的省份参数:如果是前端传的省份数组(比如?province[]=广东&province[]=浙江) // 或者如果你的请求是键为省份名的格式(比如广东=1&江苏=1),就用下面注释的代码 $selectedProvinces = $request->input('province', []); // $selectedProvinces = array_keys($request->except(['_token'])); // 适配键为省份名的请求格式 // 一次查询完成所有省份的项目统计,避免循环查库 $provinceStats = DB::table('places') ->join('projects', 'places.id', '=', 'projects.place_id') // 只统计选中的省份(如果有选中的话,否则统计所有省份) ->when(!empty($selectedProvinces), function ($query) use ($selectedProvinces) { return $query->whereIn('places.province', $selectedProvinces); }) // 按省份分组,统计每个省份的项目数 ->groupBy('places.province') ->select( 'places.province as province_name', DB::raw('count(projects.id) as project_count') ) ->get() // 转换为数组,方便视图遍历 ->toArray(); // 把统计结果传给视图 return view('admin.projects.province', compact('provinceStats')); }
为什么这样改?
- 更高效:原代码循环每个省份去查数据库,现在只用一次
JOIN+GROUP BY就完成统计,减少数据库请求次数,性能更好。 - 符合需求:直接返回「省份名称-项目数量」的结构化数组,视图里可以直接遍历使用,比如用Blade模板:
<ul> @foreach($provinceStats as $stat) <li>{{ $stat['province_name'] }}:{{ $stat['project_count'] }} 个项目</li> @endforeach </ul> - 更灵活:兼容两种请求参数格式,你可以根据前端实际传参方式选择对应的参数处理代码。
如果还有其他细节需要调整,比如要处理没有项目的省份(显示0),可以随时提出来~
内容的提问来源于stack exchange,提问作者Aimal
相关产品推荐
相关产品推荐

