Laravel5 后台站点各页面展示5张数据表计数的最佳实践咨询
嗨,我来给你梳理几个Laravel项目里处理这种全局数据表计数的实用方案,刚好你提到计数操作负载不大,选起来更灵活:
方案1:全局中间件(最适合所有页面都需要的场景)
既然每个后台页面都要显示这5个计数,用全局中间件是最直接的方式——在请求进入控制器之前就把计数准备好,共享给所有视图。
步骤很简单:
- 先创建一个中间件:
php artisan make:middleware ShareTableCounts - 在中间件的
handle方法里写计数逻辑,然后用视图共享把数据传出去:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\View; use App\Models\User; use App\Models\Order; // 导入你的其他模型 class ShareTableCounts { public function handle($request, Closure $next) { // 这里写你的计数逻辑,比如 $counts = [ 'users' => User::count(), 'orders' => Order::count(), 'products' => \App\Models\Product::count(), 'comments' => \App\Models\Comment::count(), 'categories' => \App\Models\Category::count(), ]; // 把计数共享给所有视图 View::share('tableCounts', $counts); return $next($request); } }
- 最后在
app/Http/Kernel.php的$middlewareGroups['web']数组里加入这个中间件,这样所有后台的web请求都会自动带上这些计数。
在Blade模板里直接用:
<div class="stats"> <div>用户总数:{{ $tableCounts['users'] }}</div> <div>订单总数:{{ $tableCounts['orders'] }}</div> <!-- 其他计数同理 --> </div>
方案2:视图Composer(更精准,适合绑定到布局模板)
如果你的后台用了统一的布局文件(比如resources/views/layouts/admin.blade.php),用视图Composer会更高效——只有使用这个布局的页面才会加载计数逻辑。
打开app/Providers/AppServiceProvider.php,在boot方法里添加:
use Illuminate\Support\Facades\View; use App\Models\User; use App\Models\Order; public function boot() { View::composer('layouts.admin', function ($view) { $counts = [ 'users' => User::count(), 'orders' => Order::count(), // 其他表计数 ]; $view->with('tableCounts', $counts); }); }
这样所有继承这个布局的页面,都能直接在Blade里用$tableCounts变量。
方案3:加个轻量缓存(锦上添花,减少重复查询)
虽然你说负载不大,但加个短时间缓存还是能避免重复执行count查询,尤其是后台访问量高的时候。可以把缓存逻辑和上面的方案结合起来,比如:
// 用Cache::remember设置5分钟缓存(300秒) $usersCount = \Illuminate\Support\Facades\Cache::remember('users_count', 300, function () { return User::count(); });
如果有实时性要求,比如新增数据后要立刻更新计数,可以在对应的控制器方法里清除缓存:
// 比如新增用户后 Cache::forget('users_count');
方案4:控制器基类(适合后台控制器都继承同一基类的情况)
如果你的后台所有控制器都继承了一个自定义的基类(比如AdminController),可以在基类的构造方法里提前准备好计数:
class AdminController extends Controller { protected $tableCounts; public function __construct() { $this->tableCounts = [ 'users' => User::count(), 'orders' => Order::count(), // 其他计数 ]; // 共享给视图 View::share('tableCounts', $this->tableCounts); } }
这个方案和中间件类似,但依赖控制器的继承关系,灵活性稍弱一点。
内容的提问来源于stack exchange,提问作者stevepurcell
相关产品推荐
相关产品推荐

