Laravel的分页是如何工作的?

时间:2019-08-02 10:39:47

标签: php laravel paginate

我需要澄清Laravel的分页器在后台的工作方式: 假设我有一个包含1000行的表格,我使用 $results = Model::paginate(100); 如果我理解正确,Eloquent将从表中带回包含所有行(1000)的集合,将其切成较小的100行集合,并将分页按钮数据附加到它们。现在$results包含Page 1集合和按钮的分页数据。 我的问题是:当我按下Page 2按钮时在后台会发生什么? Eloquent会再次查询数据库,再次检索整个1000行集合,对其进行切片并返回Page 2集合吗,或者它可用于我先前的请求已检索回的集合? 还是Eloquent的::paginate(100)使用限制查询数据库?喜欢 select * from table limit 100

2 个答案:

答案 0 :(得分:0)

您可以使用Laravel望远镜查看Laravel的工作原理。在查询选项卡上,您将看到发出请求时执行的查询(如果未启用缓存)。 enter image description here

答案 1 :(得分:0)

该页面可能包含所有信息: https://laravel.com/docs/5.8/pagination

查看Illuminate\Database\Eloquent\Builder类(Laravel 5.8):

/**
     * Paginate the given query.
     *
     * @param  int  $perPage
     * @param  array  $columns
     * @param  string  $pageName
     * @param  int|null  $page
     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
     *
     * @throws \InvalidArgumentException
     */
    public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)

您可以得出:

  • 这是一个查询生成器函数,因此对正在执行的mysql起作用。
  • 从文档中读取到:“分页方法会根据用户当前正在浏览的当前页面自动设置适当的限制和偏移量”。这意味着将自动考虑page url参数(即example.com?page=2)并显示正确的页面。您可以使用$pageName来修改此属性的名称。页面默认为1。
  • 当您执行paginate(100)并且页面为2时,查询将使用类似LIMIT 100 OFFSET 100的记录来获取记录101-200 。所以是的,它只检索需要查看的记录,因此非常有效。

作为旁注:存在一些分页Collection实例的解决方案,该解决方案效率较低,因为您最终每次都会查询100条记录,并将100个项目的集合分成10个页面(所以90个项目)未被使用)。但是,通常除非不需要手动组成集合(例如,包含不同类型的Eloquent模型的集合),否则通常不需要这样做。

此外,您可能想使用

https://packagist.org/packages/barryvdh/laravel-debugbar

composer require barryvdh/laravel-debugbar

它使您可以轻松查看查询和许多其他应用程序内容。