【问题标题】:How does Laravel's pagination work exactly?Laravel 的分页是如何工作的?
【发布时间】:2019-08-03 05:41:04
【问题描述】:

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

【问题讨论】:

  • 使用限制和偏移量,您只查询您需要的数据。所以你有LIMIT 100OFFSET 100*($pagenumber-1)之类的东西。

标签: php laravel pagination


【解决方案1】:

您可以使用 Laravel Telescope 来了解 Laravel 的工作原理。在查询选项卡上,您将看到发出请求时执行的查询(如果未启用缓存)。

【讨论】:

    【解决方案2】:

    可能包含所有信息的页面: 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

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

    【讨论】:

    • 因此,当与查询生成器或 Eloquent 一起使用时,paginate() 根据页码仅检索它需要的内容。完美的。正是我需要的答案。
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2021-02-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多