Laravel怎么实现分页功能_Laravel Pagination使用教程【展示】

6次阅读

laravel分页通过paginate()在数据库层用limit/offset查询并自动count(*),需避免先get()再分页;路径错误用withpath(),参数控制用appends();api返回需toarray()或自定义资源类补全meta。

Laravel怎么实现分页功能_Laravel Pagination使用教程【展示】

分页数据怎么从数据库查出来

Laravel 的分页不是前端“模拟”,而是靠 paginate() 在查询阶段就加了 LIMITOFFSET,同时顺手查了总条数。你写 Post::paginate(15),它实际执行两条 sql:一条带 LIMIT 15 OFFSET 0 查当前页数据,另一条是 select COUNT(*) 算总数。

  • 直接在 Eloquent 查询构造器上调用 paginate(),别先 get() 再分页,那会把全表拉进内存
  • 如果用了 whereRaw 或复杂联表,确保 COUNT(*) 能正确执行;某些嵌套子查询会导致 count 报错,这时得手动传 totallastPageLengthAwarePaginator
  • simplePaginate() 只查数据、不查总数,适合大表或不要页码数字的场景(比如无限滚动加载)

分页链接怎么渲染才不出错

默认 resources/views/vendor/pagination 下的 Blade 模板控制链接生成逻辑。但很多人改了路由前缀(比如用 /admin/posts)后,分页链接还是跳回 /posts?page=2,这是因为 paginate() 默认按当前请求 URL 生成链接。

  • 在控制器里调用时加参数指定路径:Post::paginate(15)->withPath('/admin/posts')
  • 如果用了 query 参数(如 ?search=php),默认会保留;不需要的话,用 appends() 显式控制:$posts->appends(['search' => $request->search])
  • 前端用 {{$posts->links()}} 渲染,别自己拼 a 标签——它自动处理禁用状态、省略号、当前页 class

自定义分页器返回 json 接口时要注意什么

API 场景下,paginate() 返回的是 LengthAwarePaginator 实例,直接 response()->json($posts) 会输出一内部属性(比如 path, per_page),而前端通常只想要 datameta 这种结构。

  • 不要直接 return $posts,用 toArray() 或更干净的 response()->json($posts->toArray()),它会转成标准分页 JSON 格式
  • 如果用 API 资源类(PostResource::Collection($posts)),记得在资源类里重写 with() 方法补上分页元信息,否则前端拿不到 last_pagetotal
  • simplePaginate() 返回的 SimplePaginator 没有 totallast_page,JSON 里对应字段是 NULL,前端做“是否还有下一页”判断时得用 next_page_url 是否存在

分页看着简单,但一动到路径、参数、API 结构或者大数据量,withPathappendssimplePaginate 这几个点最容易漏掉或配错。

text=ZqhQzanResources