如何通过Eloquent实现物品数据统计并传递至报表页面?
Laravel Eloquent 实现高效报表数据统计
控制器逻辑
直接利用Eloquent的聚合查询在数据库层面完成统计,避免拉取全量数据循环计算,大幅提升效率。
<?php namespace App\Http\Controllers; use App\Models\Item; use Illuminate\View\View; class ReportController extends Controller { public function index(): View { // 方案1:分开执行两个聚合查询 $uniqueItemsCount = Item::distinct()->count('id'); // 按id统计唯一物品,按需替换为sku/name等字段 $totalQuantity = Item::sum('quantity'); // 方案2:合并为单次数据库查询(更高效) $stats = Item::selectRaw('COUNT(DISTINCT id) as unique_items_count, SUM(quantity) as total_quantity') ->first(); // 传递数据到视图(二选一即可) return view('reports.index', compact('uniqueItemsCount', 'totalQuantity')); // return view('reports.index', [ // 'uniqueItemsCount' => $stats->unique_items_count, // 'totalQuantity' => $stats->total_quantity // ]); } }
视图展示(reports/index.blade.php)
将两个统计值并排渲染,可通过CSS调整布局样式:
<div class="report-container"> <div class="stat-block"> <h4>唯一物品总数</h4> <span class="stat-number">{{ $uniqueItemsCount }}</span> </div> <div class="stat-block"> <h4>物品总数量</h4> <span class="stat-number">{{ $totalQuantity }}</span> </div> </div> <style> .report-container { display: flex; gap: 2rem; padding: 1rem; } .stat-block { padding: 1.5rem; border: 1px solid #eee; border-radius: 8px; min-width: 200px; text-align: center; } .stat-number { font-size: 2rem; font-weight: bold; color: #2c3e50; } </style>
注意事项
- 若唯一物品的判断依据是特定业务字段(如sku、商品名称),将
COUNT(DISTINCT id)中的id替换为对应字段即可 - 合并查询的方案仅需一次数据库请求,数据量较大时优先选用
内容的提问来源于stack exchange,提问作者Sasugae
相关产品推荐
相关产品推荐

