什麼是分頁
Laravel 的分頁與查詢建構器和 Eloquent ORM 整合,無須任何設定即可使用。目前頁碼會自動從 HTTP 請求的page 查詢參數取得,並自動附加到產生的連結上。
預設的 HTML 支援 Tailwind CSS,也可選用 Bootstrap CSS。
三種分頁方式
基本用法
查詢建構器的分頁
Eloquent 的分頁
simplePaginate
若不需要總筆數的計數查詢(只顯示「上一頁」「下一頁」連結),使用simplePaginate() 會更有效率。
cursorPaginate(游標分頁)
游標分頁使用 WHERE 子句而非 OFFSET,因此在大量資料時能發揮較高的效能。特別適合無限捲動的 UI。OFFSET 與游標的比較
控制器實作
在 Blade 顯示分頁連結
links() 方法會自動產生分頁連結的 HTML,並顯示目前頁面前後各 3 頁的連結。
調整顯示的連結數量
可使用onEachSide() 變更目前頁面前後顯示的連結數量。
從請求接收每頁筆數
在同一頁顯示多個分頁器
若在同一畫面顯示 2 個分頁器,兩者都使用page 參數會衝突。可用第 3 個引數變更參數名稱。
URL 自訂
變更基礎 URL
附加查詢參數
加入 hash fragment
API 回應(JSON 輸出)
若直接從路由或控制器回傳分頁器,會自動轉為 JSON。與 API 資源結合
若要以 API 資源集合包裝paginate() 的結果,將它傳給 UserResource::collection():
UserResource::collection(),分頁資訊會自動作為中繼資料附加。
cursorPaginate() 的 JSON 中不會有頁碼,而是 next_cursor 與 prev_cursor。API 客戶端將這些值作為下一次請求的 cursor 參數使用。自訂分頁 view
直接在 view 中指定
將預設 view 改為自訂檔案
首先發布官方 view 再進行自訂。resources/views/vendor/pagination/ 底下會產生以下檔案:
tailwind.blade.php— 預設(Tailwind CSS 用)bootstrap-5.blade.php— Bootstrap 5 用simple-tailwind.blade.php— simplePaginate 用- …
tailwind.blade.php,或建立新的 view 並在 AppServiceProvider 指定。
使用 Bootstrap CSS
若使用 Bootstrap 而非 Tailwind,可在AppServiceProvider 的 boot() 中指定:
手動建立分頁器
若想對陣列等既有資料套用分頁,可以直接實例化分頁器類別。常用的實例方法
總結
分頁方式的選擇
分頁方式的選擇
paginate()— 需要總筆數與頁碼連結時(一般的列表畫面)simplePaginate()— 僅需「上一頁」「下一頁」連結即可時(較快)cursorPaginate()— 資料量大、無限捲動、寫入頻繁時(最佳效能)
Blade 顯示的基本模式
Blade 顯示的基本模式
paginate() 的結果傳到 view,用 links() 輸出分頁連結即可。
目前頁面會自動由 page 查詢參數偵測。API 中的分頁
API 中的分頁
直接從路由回傳分頁器會自動轉為 JSON。
若要與 API 資源結合,回傳
UserResource::collection($paginator)。
回應中包含 data(記錄陣列)以及各項中繼資訊。