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

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

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

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

paginate()

方法,而获取这些分页数据,就是操作

paginate()

返回的那个分页器对象。

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

paginate()

方法。这个方法用起来挺直观的,你只需要在你想要分页的查询后面链式调用它,并传入每页显示的数量即可。比如,如果你想把

Post

模型的所有文章分页,每页显示15篇,代码大概就是这样:

use appModelsPost;  // 在控制器或服务中 $posts = Post::query()->paginate(15);  // 这样,$posts就是一个Paginator实例了 // 视图中可以直接循环 $posts 来展示数据 // 并且可以通过 $posts->links() 来生成分页导航
paginate(15)

会帮我们处理好SQL语句中的

LIMIT

OFFSET

,还会自动计算总页数、当前页等信息。有时候,如果你只是想简单地显示“上一页/下一页”按钮,而不需要知道总共有多少页,可以使用

simplePaginate(15)

,这样可以减少数据库的查询开销,因为它不会去执行

COUNT(*)

操作。这在数据量特别大,或者对性能要求极高的场景下,是个不错的优化点。

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

说实话,自定义每页显示数量是挺常见的需求。我们不能总是写死一个数字,用户可能想看多点或少点。最灵活的方式,我觉得是结合请求参数来动态设置。比如,从URL里获取一个

per_page

参数,如果用户没传,就给个默认值。

use IlluminateHttpRequest; use AppModelsPost;  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 IlluminatePaginationPaginator;  public function boot() {     Paginator::useBootstrapFive(); // 或者 Paginator::defaultView('your-custom-pagination-view'); }

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

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

当你调用

paginate()

方法后,返回的并不是一个普通的集合,而是一个

IlluminatePaginationLengthAwarePaginator

(或

Paginator

)实例。这个实例里面封装了所有你可能需要的关于分页的信息。这玩意儿,用起来真是方便。

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

笔魂AI

笔魂AI绘画-在线AI绘画、AI画图、AI设计工具软件

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

查看详情 Laravel模型分页?分页数据怎样获取?

假设我们有

$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 IlluminateHttpRequest; use AppModelsPost;  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)来进一步定制输出格式,但那是另一个话题了。

以上就是Laravel模型分页?分页数据怎样获取?的详细内容,更多请关注laravel css php vue react html js 前端 bootstrap json app php laravel sql json css bootstrap html 前端框架 Resource count 封装 循环 接口 JS 对象 数据库 ui

大家都在看:

laravel css php vue react html js 前端 bootstrap json app php laravel sql json css bootstrap html 前端框架 Resource count 封装 循环 接口 JS 对象 数据库 ui

app
上一篇
下一篇