Laravel模型分页通过paginate()方法实现,可自动处理SQL的LIMIT和OFFSET并计算分页信息;支持动态设置每页数量、自定义分页样式及API接口中返回JSON格式数据,便于前后端交互。

Laravel模型分页这事儿,说白了就是把数据库里一大堆数据,按你想要的大小,切成一页一页的,然后一页一页地展示出来。核心就是用
paginate()
paginate()
Laravel模型分页的实现,主要依赖于Eloquent查询构建器或DB查询构建器上的
paginate()
Post
use App\Models\Post; // 在控制器或服务中 $posts = Post::query()->paginate(15); // 这样,$posts就是一个Paginator实例了 // 视图中可以直接循环 $posts 来展示数据 // 并且可以通过 $posts->links() 来生成分页导航
paginate(15)
LIMIT
OFFSET
simplePaginate(15)
COUNT(*)
说实话,自定义每页显示数量是挺常见的需求。我们不能总是写死一个数字,用户可能想看多点或少点。最灵活的方式,我觉得是结合请求参数来动态设置。比如,从URL里获取一个
per_page
use Illuminate\Http\Request;
use App\Models\Post;
public function index(Request $request)
{
$perPage = $request->input('per_page', 10); // 默认每页10条
$posts = Post::query()->paginate($perPage);
return view('posts.index', compact('posts'));
}这样,用户访问
your-app.com/posts?per_page=20
至于分页器的样式,Laravel默认提供了一套基于Tailwind CSS或Bootstrap的样式,通过
$posts->links()
php artisan vendor:publish --tag=laravel-pagination
执行完这条命令后,你会发现
resources/views/vendor/pagination
.blade.php
tailwind.blade.php
bootstrap-4.blade.php
AppServiceProvider
boot
use Illuminate\Pagination\Paginator;
public function boot()
{
Paginator::useBootstrapFive(); // 或者 Paginator::defaultView('your-custom-pagination-view');
}我个人觉得,直接改动这些Blade文件,自由度是最高的。不过,如果只是想微调颜色字体啥的,直接在项目CSS里覆盖默认样式也行,看你需求了。
当你调用
paginate()
Illuminate\Pagination\LengthAwarePaginator
Paginator
假设我们有
$posts = Post::query()->paginate(15);
$posts->currentPage()
$posts->lastPage()
$posts->perPage()
$posts->total()
$posts->firstItem()
$posts->lastItem()
$posts->hasMorePages()
$posts->items()
$posts->getCollection()
这些方法在视图里特别有用,比如你可能想显示“显示第X到Y条,共Z条记录”这样的信息。
<p>
显示第 {{ $posts->firstItem() }} 到 {{ $posts->lastItem() }} 条,
共 {{ $posts->total() }} 条记录。
当前在第 {{ $posts->currentPage() }} 页,总共 {{ $posts->lastPage() }} 页。
</p>我发现,很多时候开发者会直接在前端通过循环
$posts
在API接口中处理分页,跟传统的Web页面渲染有所不同。我们通常会返回JSON格式的数据,而不是渲染HTML。Laravel的分页器对象在被转换为JSON时,会自动包含所有必要的元数据和链接,这简直是为API量身定做的。
当你从控制器返回一个分页器实例时,Laravel会自动将其序列化为JSON。一个典型的JSON响应结构会是这样:
{
"data": [
{ /* post 1 */ },
{ /* post 2 */ },
// ... 当前页的文章数据
],
"links": {
"first": "http://example.com/api/posts?page=1",
"last": "http://example.com/api/posts?page=5",
"prev": null, // 或前一页的URL
"next": "http://example.com/api/posts?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"path": "http://example.com/api/posts",
"per_page": 15,
"to": 15,
"total": 70
}
}在控制器里,你只需要:
use Illuminate\Http\Request;
use App\Models\Post;
public function index(Request $request)
{
$perPage = $request->input('per_page', 15);
$posts = Post::query()->paginate($perPage);
// Laravel会自动将Paginator实例序列化为上述JSON结构
return response()->json($posts);
}前端(比如用Vue、React或原生JS)拿到这个JSON后,就可以很方便地解析:
response.data
response.meta.current_page
response.meta.total
response.links.next
response.links.prev
我个人觉得,这种设计非常优雅,把后端分页的复杂性很好地封装起来,前端只需要关注数据和导航链接就行。不需要前端再自己去拼凑分页URL或者计算总页数,大大简化了前后端协作。当然,如果你觉得默认的JSON结构不完全符合你的需求,也可以通过资源(Resource)来进一步定制输出格式,但那是另一个话题了。
以上就是Laravel模型分页?分页数据怎样获取?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号