我需要澄清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
?
答案 0 :(得分:0)
答案 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)
您可以得出:
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
它使您可以轻松查看查询和许多其他应用程序内容。