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

Laravel 10.x 全局配置分页每页条数的实现方法

Laravel 10.x 全局配置分页每页记录数

问题背景

在Laravel 10.x中,我们通常通过以下代码指定分页的每页记录数:

$payments = Payment::paginate(10);
$users = User::paginate(10);

但后续如果需要统一修改这个数值,逐个修改代码会非常繁琐。如何通过全局配置实现灵活、统一的设置?

用户已尝试的两种方法:

  • 在config目录创建pagination.php配置文件:
<?php

return [
    'per_page' => 1,
];
  • 修改AppServiceProvider.php的boot方法:
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;

class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        //
    }

    public function boot(): void
    {
        Paginator::perPage(1);
    }
}

推荐解决方案

方案一:配置文件+服务提供者结合(最灵活)

这种方式既支持全局统一默认值,也能为特定模型单独设置分页数量,同时保留临时覆盖的能力。

  1. 完善config/pagination.php配置文件:
<?php

return [
    // 全局默认每页记录数
    'default_per_page' => 10,

    // 特定模型的自定义分页数量(按需添加)
    'models' => [
        App\Models\User::class => 20,
        App\Models\Payment::class => 15,
    ],
];
  1. 修改AppServiceProvider.php的boot方法,读取配置并生效:
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;

class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        //
    }

    public function boot(): void
    {
        // 设置全局默认分页数量
        Paginator::defaultPerPage(config('pagination.default_per_page'));

        // 为指定模型绑定自定义分页数量
        foreach (config('pagination.models', []) as $modelClass => $perPage) {
            if (class_exists($modelClass)) {
                $modelClass::query()->macro('paginate', function ($perPageOverride = null, $columns = ['*'], $pageName = 'page', $page = null) use ($perPage) {
                    $finalPerPage = $perPageOverride ?? $perPage;
                    return parent::paginate($finalPerPage, $columns, $pageName, $page);
                });
            }
        }
    }
}

使用方式:

  • 全局模型默认用配置的10条:$payments = Payment::paginate();
  • User模型用配置的20条:$users = User::paginate();
  • 临时覆盖配置值:$users = User::paginate(50);

方案二:仅全局默认配置(简单场景)

如果不需要为特定模型单独设置,直接用最简单的全局默认配置即可。

  1. 保留config/pagination.php的基础配置:
<?php

return [
    'default_per_page' => 10,
];
  1. 在AppServiceProvider中设置全局默认:
public function boot(): void
{
    Paginator::defaultPerPage(config('pagination.default_per_page'));
}

使用方式:

  • 不传参数用全局默认:$payments = Payment::paginate();
  • 临时修改:$payments = Payment::paginate(50);

方案三:模型基类定义(面向模型维度)

如果希望每个模型自主控制默认分页数量,可以通过基类统一管理。

  1. 创建app/Models/BaseModel.php基类:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    // 全局模型默认分页数,子类可重写
    protected $perPage = 10;
}
  1. 让业务模型继承该基类,按需重写默认值:
<?php

namespace App\Models;

class User extends BaseModel
{
    // User模型单独设置默认分页数为20
    protected $perPage = 20;
}

使用方式:

  • 使用模型默认值:$users = User::paginate();
  • 临时覆盖:$users = User::paginate(50);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:57:38