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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:06