跳轉到主要內容

什麼是分頁

Laravel 的分頁與查詢建構器和 Eloquent ORM 整合,無須任何設定即可使用。目前頁碼會自動從 HTTP 請求的 page 查詢參數取得,並自動附加到產生的連結上。 預設的 HTML 支援 Tailwind CSS,也可選用 Bootstrap CSS。

三種分頁方式

基本用法

查詢建構器的分頁

Eloquent 的分頁

simplePaginate

若不需要總筆數的計數查詢(只顯示「上一頁」「下一頁」連結),使用 simplePaginate() 會更有效率。
若不需要顯示「共 X 筆中的第 Y 筆」,請選 simplePaginate()。paginate() 會額外執行 COUNT(*) 查詢,因此 simplePaginate() 較快。

cursorPaginate(游標分頁)

游標分頁使用 WHERE 子句而非 OFFSET,因此在大量資料時能發揮較高的效能。特別適合無限捲動的 UI。
產生的 URL 內含的是游標字串,而非頁碼。
使用游標分頁時 orderBy 為必要。此外,排序欄位必須屬於進行分頁的資料表。

OFFSET 與游標的比較

游標分頁可有效利用索引,即使資料頻繁新增/刪除,也較不易發生記錄重複或遺漏。缺點是無法產生頁碼連結,只有「上一頁」「下一頁」。

控制器實作

在 Blade 顯示分頁連結

links() 方法會自動產生分頁連結的 HTML,並顯示目前頁面前後各 3 頁的連結。

調整顯示的連結數量

可使用 onEachSide() 變更目前頁面前後顯示的連結數量。

從請求接收每頁筆數

在同一頁顯示多個分頁器

若在同一畫面顯示 2 個分頁器,兩者都使用 page 參數會衝突。可用第 3 個引數變更參數名稱。

URL 自訂

變更基礎 URL

附加查詢參數

加入 hash fragment

API 回應(JSON 輸出)

若直接從路由或控制器回傳分頁器,會自動轉為 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() — 資料量大、無限捲動、寫入頻繁時(最佳效能)
只要將 paginate() 的結果傳到 view,用 links() 輸出分頁連結即可。 目前頁面會自動由 page 查詢參數偵測。
直接從路由回傳分頁器會自動轉為 JSON。 若要與 API 資源結合,回傳 UserResource::collection($paginator)。 回應中包含 data(記錄陣列)以及各項中繼資訊。
最後修改於 2026年8月2日