laravel-admin分页失效的根本原因是Grid未接收到分页实例,必须在Grid::make()前显式调用模型的paginate()方法;DB::table()->paginate()因缺少Eloquent特性易被忽略,推荐统一使用Eloquent模型分页。

laravel-admin 分页失效,本质是查询构建器没走 paginate()
laravel-admin 的列表页默认不自动调用 paginate(),它依赖你显式返回一个分页实例。如果你在 grid 里只写了 Model::query() 或 DB::table()->get(),那数据是全量查出来的,->paginate() 根本没执行,自然没有分页逻辑和链接。
- 常见错误现象:页面一次性渲染全部数据,URL 没有
?page=2,点击分页按钮无反应或报 404 - 正确写法必须是:在
Grid::make()之前或内部确保模型查询最终调用了paginate() - laravel-admin 的
Grid构造器本身不接管分页,它只是渲染层;分页由底层 Eloquent 或查询构建器完成 - 如果你用了
DB::table('xxx')->get(),它返回的是普通集合,->links()会报错——因为集合没有links()方法
为什么 DB::table()->paginate() 在 laravel-admin 中可能不生效
即使你写了 DB::table('users')->paginate(15),laravel-admin 的 Grid 仍可能忽略它,因为它期望接收一个 Eloquent 模型实例(带关系、访问器、分页元数据),而不是原始分页器对象。
-
DB::table()->paginate()返回的是LengthAwarePaginator,但Grid内部会尝试调用$model->newQuery()等方法,而原生查询构造器没有这些 - 推荐统一用 Eloquent 模型:比如
User::where(...)->paginate(15),这样Grid才能正确识别并复用分页上下文 - 若必须用原生查询,得手动包装成兼容格式,例如通过
Grid::make(new Collection($data), $paginator)——但这是非常规做法,易出兼容问题 - 注意:laravel-admin v2.x 默认基于 Laravel 8+,
LengthAwarePaginator构造需显式传入总条数、当前页、每页数,不能只靠DB::paginate()返回值直接塞进去
检查分页参数是否被意外覆盖或丢失
laravel-admin 默认从 request()->query('page') 读取页码,但如果中间件、路由绑定或自定义 Grid 配置干扰了请求参数,分页就会“卡”在第一页。
- 典型干扰点:
appends()调用后未保留page参数,导致下一页链接变成?sort=name而不是?sort=name&page=2 - 在
Grid初始化后加一句$grid->setPerPage(15)是安全的,但不要在model()->paginate()之后再调用setPath()却漏掉appends()原始参数 - 调试技巧:在控制器中 dump
request()->all(),确认page是否存在且为整数;再 dump$users instanceof \Illuminate\Pagination\LengthAwarePaginator看类型是否正确 - 如果用了多级嵌套路由(如
admin/users/{id}/logs),setPath()必须显式设为完整路径,否则分页链接会拼到根路径去
自定义分页视图时 links() 不渲染?检查 vendor 发布状态
laravel-admin 使用自己的分页模板,但它底层仍调用 Laravel 的 $paginator->links()。如果你运行过 php artisan vendor:publish --tag=laravel-pagination,却没改对位置,links() 可能找不到 Blade 模板。
- laravel-admin 默认不强制使用 Laravel 原生分页视图;它有自己的
admin::partials.pagination,但前提是你的Grid没被手动指定其他视图 - 检查
resources/views/vendor/admin/grid/table.blade.php是否存在,里面是否包含类似{!! $grid->paginator->links() !!}的调用 - 如果手动替换了
links()渲染逻辑,确保传入的$grid->paginator确实是分页器实例,而非空值或数组 - 最简验证法:在视图里加一行
{{ dd($users->currentPage(), $users->lastPage()) }},看是否能正常输出数字
真正容易被忽略的点是:laravel-admin 的 Grid 在初始化时会缓存一次查询结果,如果你在 Grid::make() 后又调用 paginate(),其实已经晚了——分页必须发生在 Grid 构建数据源的那一刻。所以别在 Grid 实例化之后再试图“补救”分页逻辑。


















