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

在Laravel中构建自定义宽表报表是否有简便实现方法?

Laravel 快速构建多产品员工销售宽表方案

你需要的这类宽表本质是行转列的透视表,用Laravel自带功能或常用扩展就能快速实现,不需要手动写死表头或统计逻辑:

方案1:用原生查询构造器实现(无需额外装包)

仅靠Laravel自带的查询构造器就能搞定数据层的动态透视,支持自动适配产品、员工数量变化:

  • 先确认你的数据库有三个核心表:employees(员工表,存ID、姓名等基础信息)、products(产品表,存ID、产品名称)、sales(销售明细表,存员工ID、产品ID、销售数量、销售时间)
  • 第一步先动态拉取YTD维度的所有产品列表,自动构造统计列:
// 先查询本年(YTD维度)产生过销售的所有产品
$ytdProducts = Product::whereHas('sales', function($query) {
    $query->whereYear('sold_at', now()->year);
})->pluck('name', 'id');

// 动态拼接每个产品的销售统计字段
$selectFields = [
    DB::raw('employees.name as employee_name')
];
foreach ($ytdProducts as $productId => $productName) {
    $selectFields[] = DB::raw(
        "SUM(CASE WHEN sales.product_id = {$productId} THEN sales.quantity ELSE 0 END) as `{$productName}`"
    );
}

// 执行查询直接拿到结构化的宽表数据
$reportData = Employee::select($selectFields)
    ->leftJoin('sales', function($join) {
        $join->on('employees.id', '=', 'sales.employee_id')
            ->whereYear('sales.sold_at', now()->year);
    })
    ->groupBy('employees.id', 'employees.name')
    ->get();
  • 视图层渲染直接用$ytdProducts->values()输出表头,遍历$reportData输出每行的员工姓名和对应产品销量即可,40+产品、80+员工的查询量完全无性能压力。

方案2:用laravel-excel快速生成可导出报表

如果需要支持导出Excel/PDF,直接用Laravel生态常用的laravel-excel扩展即可,不需要写额外的视图渲染逻辑:

  • 安装扩展后自定义导出类,把上述透视逻辑放到导出类的对应方法中,就能一键生成报表:
// 导出类中定义表头,自动拉取YTD产品名
public function headings(): array
{
    return array_merge(
        ['员工姓名'],
        Product::whereHas('sales', fn($q) => $q->whereYear('sold_at', now()->year))
            ->pluck('name')
            ->toArray()
    );
}

两种方案都支持动态适配产品、员工数量,后续新增产品、员工不需要修改代码逻辑,自动兼容。

内容的提问来源于stack exchange,提问作者Muhammad Arslan Khalid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:54:01