Skip to main content

什麼是分頁

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_cursorprev_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,可在 AppServiceProviderboot() 中指定:

手動建立分頁器

若想對陣列等既有資料套用分頁,可以直接實例化分頁器類別。

常用的實例方法

總結

  • paginate() — 需要總筆數與頁碼連結時(一般的列表畫面)
  • simplePaginate() — 僅需「上一頁」「下一頁」連結即可時(較快)
  • cursorPaginate() — 資料量大、無限捲動、寫入頻繁時(最佳效能)
只要將 paginate() 的結果傳到 view,用 links() 輸出分頁連結即可。 目前頁面會自動由 page 查詢參數偵測。
直接從路由回傳分頁器會自動轉為 JSON。 若要與 API 資源結合,回傳 UserResource::collection($paginator)。 回應中包含 data(記錄陣列)以及各項中繼資訊。
最後修改於 2026年8月2日