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

Laravel全局设置自定义$perPage分页上限(默认15,限制最大500条)

嘿,这个需求我之前做项目的时候刚好实现过,要全局控制分页条数还带上限,不用每个查询都手动设置,其实有几种很实用的方案,我给你挑最靠谱的几个说说:

方法一:自定义模型基类(最推荐,彻底全局生效)

Laravel的所有模型都默认继承Eloquent\Model,我们可以自己写一个基类,让所有业务模型都继承它,然后在这个基类里重写分页条数的逻辑,这样所有模型的分页都会自动遵守规则。

步骤如下:

  1. 创建BaseModel基类
    在app/Models目录下新建BaseModel.php,代码如下:
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    /**
     * 重写获取分页条数的方法
     * @return int
     */
    public function getPerPage()
    {
        // 从请求中获取perPage参数,默认用框架的15条
        $perPage = request()->input('perPage', parent::getPerPage());
        // 转成整数,确保最小值1,最大值500
        $perPage = max(1, min((int)$perPage, 500));
        
        return $perPage;
    }
}
  1. 让所有业务模型继承BaseModel
    比如你的User、Post模型,都改成继承BaseModel而不是默认的Model:
namespace App\Models;

// 原来的 use Illuminate\Database\Eloquent\Model; 替换成下面的
class User extends BaseModel
{
    // ... 模型原有代码不变
}

这样不管你在控制器里写User::paginate(),还是Post::where('status', 1)->paginate(),都会自动读取请求里的perPage参数,而且自动限制在1-500之间,完全不用在每个查询里额外设置!

方法二:全局中间件处理请求参数

如果你不想改模型基类,也可以用中间件统一处理请求里的perPage参数,把它限制在合理范围内,之后在调用分页的时候直接用这个处理后的参数。

  1. 创建中间件
    运行Artisan命令生成中间件:
php artisan make:middleware SetPerPageLimit

然后打开app/Http/Middleware/SetPerPageLimit.php,修改代码:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SetPerPageLimit
{
    public function handle(Request $request, Closure $next)
    {
        $perPage = $request->input('perPage', 15);
        // 确保参数是正整数,且不超过500
        $processedPerPage = max(1, min((int)$perPage, 500));
        // 把处理后的参数重新合并到请求里
        $request->merge(['perPage' => $processedPerPage]);
        
        return $next($request);
    }
}
  1. 注册全局中间件
    打开app/Http/Kernel.php,把这个中间件加到全局中间数组$middleware里:
protected $middleware = [
    // ... 其他中间件
    \App\Http\Middleware\SetPerPageLimit::class,
];

之后在控制器里调用分页的时候,直接传请求里的参数就行:

public function index(Request $request)
{
    $users = User::paginate($request->perPage);
    return view('users.index', compact('users'));
}

这个方法的好处是不用改模型,但需要确保所有分页调用都传入$request->perPage,相对来说不如第一种方法彻底。

方法三:查询宏扩展(适合局部统一调用)

如果只是想统一分页方法,但不想改模型或中间件,可以给Eloquent的查询构建器加一个宏,封装带限制的分页逻辑:

打开app/Providers/AppServiceProvider.php,在boot方法里添加:

use Illuminate\Database\Eloquent\Builder;

public function boot()
{
    Builder::macro('paginateWithLimit', function ($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) {
        $perPage = $perPage ?? request()->input('perPage', 15);
        $perPage = max(1, min((int)$perPage, 500));
        
        return $this->paginate($perPage, $columns, $pageName, $page);
    });
}

之后在控制器里就可以用这个宏来分页:

$users = User::paginateWithLimit();
// 或者手动传值,也会被限制:$users = User::paginateWithLimit(600); // 实际只会取500条

这个方法需要把原来的paginate()替换成paginateWithLimit(),适合不想大范围改动但需要统一规则的场景。


内容的提问来源于stack exchange,提问作者bipipoh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:04:49