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