跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

PHP分页怎么用框架实现_Laravel等框架分页使用指南【详解】

Laravel 的 paginate() 返回 LengthAwarePaginator 实例而非数组,因其需封装数据、总条数、当前页等分页元数据;取数据用 items(),前端渲染用 links(),API 返回需手动构造 JSON 结构。 Laravel 的
paginate()
为什么返回的是对象而不是数组? 因为
paginate()
返回的是
LengthAwarePaginator
实例,它封装了数据、总条数、当前页、页码链接等信息,不是原始数组。直接
json_encode()
或
foreach
会出错或漏掉分页元数据。 要取数据用
$posts->items()
(返回数组),不要直接遍历
$posts
前端需要分页 HTML 时,用
{{$posts->links()}}
(Blade 中自动渲染) API 场景下想返回 JSON,需手动构造结构:
{ "data": $posts->items(), "current_page": $posts->currentPage(), "last_page": $posts->lastPage(), "total": $posts->total() }
注意:调用
items()
不会重复查库,数据已加载到内存 分页时 WHERE 条件写错导致总数不准怎么办? 常见于使用
DB::table()->where(...)->paginate()
但条件里混用了聚合、JOIN 或子查询——Laravel 默认用
COUNT(*)
模拟总数,可能和实际数据不一致。 确认是否用了
groupBy
、
distinct
或多表
join
:这些会让
paginate()
的 COUNT 失效 临时解决:改用
simplePaginate()
(不计算总数,只判断“是否有下一页”,性能更好) 彻底解决:手动传入总数,例如
new LengthAwarePaginator($items, $total, $perPage, $page)
避免在分页前用
selectRaw('COUNT(DISTINCT xxx)')
——它会影响后续
paginate()
的 COUNT 逻辑 自定义分页 URL 参数(比如把
page=2
改成
p=2
) Laravel 默认用
page
参数,但 SEO 或旧系统对接时经常要改。不能只改路由,还要告诉分页生成器用哪个键。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 在
paginate()
后链式调用
appends()
只能追加参数,不能改 key 正确做法:用
withQueryString()
+ 手动设置查询参数:
$posts = Post::where('status', 1)->paginate(10); $posts->withPath('/posts')->setPageName('p');
setPageName('p')
会同时影响生成链接的 key 和请求时读取的 key 如果用了
appends()
传其他参数(如
category=tech
),
setPageName()
仍生效,不会冲突 分页器报错 “Call to undefined method links()” 怎么办? 这个错误几乎只发生在你把
Collection
当成了分页器对象,比如先用
get()
拿到集合,再试图调用
links()
。 立即学习 “ PHP免费学习笔记(深入) ”; 检查是否误写了
Post::where(...)->get()->paginate(10)
——
get()
返回 Collection,没有
paginate()
方法 或者用了
collect($array)->paginate()
:Collection 类没有
paginate()
,得用
LengthAwarePaginator
手动包装 调试技巧:dump
get_class($posts)
,如果是
Illuminate\Support\Collection
就肯定错了 记住口诀:数据库查询才用
paginate()
;内存数组分页必须手动 new 分页器 分页看似简单,但多数线上问题都出在「以为拿到的是分页对象,其实只是数组或集合」,以及「总数统计被复杂查询悄悄破坏」——这两点不验证清楚,后面加缓存、改样式、接 API 都会反复踩坑。

相关文章