我需要澄清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一样
发布于 2019-08-02 18:58:27
您可以使用Laravel望远镜来了解Laravel是如何工作的。在queries选项卡上,您将看到在发出请求时执行了哪些查询(如果未启用缓存)。

发布于 2019-08-03 05:41:04
可能包含所有信息的页面: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修改此属性的名称)。Page默认为1.paginate(100),页面是2,时,查询将使用类似于LIMIT 100 OFFSET 100的东西来获取记录101-200。是的,它只检索需要查看的记录,因此效率很高。作为附注:有一些解决方案可以对Collection实例进行分页,效率较低,因为您每次查询100条记录,并将100个项的集合划分为10个一页(因此没有使用90个项)。但是,这通常是不需要的,除非您必须手动编写集合(比如包含不同类型的雄辩模型的集合)。
另外,作为附注,您可能希望使用
https://packagist.org/packages/barryvdh/laravel-debugbar
composer require barryvdh/laravel-debugbar
它允许您轻松查看查询和许多其他应用程序内容。
https://stackoverflow.com/questions/57324838
复制相似问题