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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:34:21