簡體   English   中英

Laravel的分頁是如何工作的?

[英]How does Laravel's pagination work exactly?

我需要澄清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一樣?

您可以使用Laravel望遠鏡來查看Laravel的工作原理。 在查詢選項卡上,您將看到發出請求時執行的查詢(如果未啟用緩存)。 在此處輸入圖片說明

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

查看Illuminate\\Database\\Eloquent\\Builder Eloquent 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

它使您可以輕松查看查詢和許多其他應用程序內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM