0

0

Laravel模型分页?分页数据怎样获取?

小老鼠

小老鼠

发布时间:2025-09-13 08:36:02

|

467人浏览过

|

来源于php中文网

原创

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

laravel模型分页?分页数据怎样获取?

Laravel模型分页这事儿,说白了就是把数据库里一大堆数据,按你想要的大小,切成一页一页的,然后一页一页地展示出来。核心就是用

paginate()
方法,而获取这些分页数据,就是操作
paginate()
返回的那个分页器对象。

Laravel模型分页的实现,主要依赖于Eloquent查询构建器或DB查询构建器上的

paginate()
方法。这个方法用起来挺直观的,你只需要在你想要分页的查询后面链式调用它,并传入每页显示的数量即可。比如,如果你想把
Post
模型的所有文章分页,每页显示15篇,代码大概就是这样:

use App\Models\Post;

// 在控制器或服务中
$posts = Post::query()->paginate(15);

// 这样,$posts就是一个Paginator实例了
// 视图中可以直接循环 $posts 来展示数据
// 并且可以通过 $posts->links() 来生成分页导航

paginate(15)
会帮我们处理好SQL语句中的
LIMIT
OFFSET
,还会自动计算总页数、当前页等信息。有时候,如果你只是想简单地显示“上一页/下一页”按钮,而不需要知道总共有多少页,可以使用
simplePaginate(15)
,这样可以减少数据库的查询开销,因为它不会去执行
COUNT(*)
操作。这在数据量特别大,或者对性能要求极高的场景下,是个不错的优化点。

Laravel分页器如何自定义每页显示数量及样式?

说实话,自定义每页显示数量是挺常见的需求。我们不能总是写死一个数字,用户可能想看多点或少点。最灵活的方式,我觉得是结合请求参数来动态设置。比如,从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
就能看到每页20条了。

至于分页器的样式,Laravel默认提供了一套基于Tailwind CSS或Bootstrap的样式,通过

$posts->links()
方法就能渲染出来。但很多时候,我们自己的项目有独特的UI风格,或者压根没用这些前端框架。这时候,我们可以发布Laravel自带的分页视图文件进行修改:

php artisan vendor:publish --tag=laravel-pagination

执行完这条命令后,你会发现

resources/views/vendor/pagination
目录下多了一些
.blade.php
文件,比如
tailwind.blade.php
bootstrap-4.blade.php
等。你可以选择其中一个作为基础,复制一份,然后按照你的设计稿去修改HTML和CSS。修改完后,在你的服务提供者(比如
AppServiceProvider
)的
boot
方法里指定使用你的自定义视图:

use Illuminate\Pagination\Paginator;

public function boot()
{
    Paginator::useBootstrapFive(); // 或者 Paginator::defaultView('your-custom-pagination-view');
}

我个人觉得,直接改动这些Blade文件,自由度是最高的。不过,如果只是想微调颜色字体啥的,直接在项目CSS里覆盖默认样式也行,看你需求了。

获取Laravel分页数据时,如何提取总数、当前页等关键信息?

当你调用

paginate()
方法后,返回的并不是一个普通的集合,而是一个
Illuminate\Pagination\LengthAwarePaginator
(或
Paginator
)实例。这个实例里面封装了所有你可能需要的关于分页的信息。这玩意儿,用起来真是方便。

Favird No-Code Tools
Favird No-Code Tools

无代码工具的聚合器

下载

假设我们有

$posts = Post::query()->paginate(15);
,你可以这样获取各种信息:

  • 当前页码:
    $posts->currentPage()
  • 总页数:
    $posts->lastPage()
  • 每页显示数量:
    $posts->perPage()
  • 总记录数:
    $posts->total()
  • 当前页的第一条记录索引:
    $posts->firstItem()
    (这是相对于总记录数的索引,从1开始)
  • 当前页的最后一条记录索引:
    $posts->lastItem()
  • 是否有更多页(即是否还有下一页):
    $posts->hasMorePages()
  • 获取当前页的数据集合:
    $posts->items()
    或直接
    $posts->getCollection()

这些方法在视图里特别有用,比如你可能想显示“显示第X到Y条,共Z条记录”这样的信息。

<p>
    显示第 {{ $posts->firstItem() }} 到 {{ $posts->lastItem() }} 条,
    共 {{ $posts->total() }} 条记录。
    当前在第 {{ $posts->currentPage() }} 页,总共 {{ $posts->lastPage() }} 页。
</p>

我发现,很多时候开发者会直接在前端通过循环

$posts
来获取数据,而忽略了这些方便的元信息方法。其实它们才是分页的核心价值之一,能让你更精准地展示分页状态。

Laravel分页在API接口中如何处理和前端交互?

在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。

我个人觉得,这种设计非常优雅,把后端分页的复杂性很好地封装起来,前端只需要关注数据和导航链接就行。不需要前端再自己去拼凑分页URL或者计算总页数,大大简化了前后端协作。当然,如果你觉得默认的JSON结构不完全符合你的需求,也可以通过资源(Resource)来进一步定制输出格式,但那是另一个话题了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

340

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

293

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

772

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

141

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

80

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

463

2026.03.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 13.2万人学习

CSS3 教程
CSS3 教程

共18课时 | 7万人学习

Vue 教程
Vue 教程

共42课时 | 9.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号