分頁
簡介
在其它框架中,分頁可能會非常痛苦。 Laravel 的分頁器將 查詢建構器 和 Eloquent ORM 結合起來,提供了方便、易用的資料庫結果集分頁。透過分頁器產生的 HTML 相容 Bootstrap CSS 框架。
#基本用法
#查詢建構器分頁
資料分頁有幾種方法。最簡單的是使用 查詢建構器 或 Eloquent query 的
paginate
paginate方法的唯一參數是你希望在每頁顯示的記錄條數。在此處,我們指定要在每頁顯示方法根據使用者瀏覽的目前頁碼,自動設定適當的偏移量 offset 和限制數 limit。預設情況下,HTTP 請求中的
paginatepage
查詢參數值被當作目前頁的頁碼。 Lavarel 會自動偵測該值,並自動將其插入分頁器產生的連結中。在下面的範例中,傳遞給
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller{
/**
* 显示应用程序中的所有用户。
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->paginate(15);
return view('user.index', ['users' => $users]);
}
}
#{note} 目前,Lavarel 無法有效率地執行使用了groupBy
#語句的分頁操作。如果你需要使用對使用了
simplePaginate 方法執行更有效率地查詢。這在資料很多且不需要在渲染視圖時顯示每頁的頁碼時非常有用:
$users = DB::table('users')->simplePaginate(15);
#Eloquent 分頁
User 模型按每頁
15
$users = App\User::paginate(15);你也可以在呼叫paginate 之前,在查詢中設定諸如
$users = User::where('votes', '>', 100)->paginate(15);###在Eloquent 分頁中還能使用###simplePaginate### 方法:###
$users = User::where('votes', '>', 100)->simplePaginate(15);##################
手動建立分頁
有時你可能想要手動建立分頁,並傳遞一個陣列集給它。可以透過建立 Illuminate\Pagination\Paginator
或 Illuminate\Pagination\LengthAwarePaginator
實例來實現,這有賴於你的需求。 .
Paginator
類別不需要知道結果集的總數;但是,這樣一來,這個類別就沒辦法獲知最後一頁的索引。 LengthAwarePaginator
接受和 Paginator
幾乎相同的參數;不過,它會計算結果集的總數。
換句話說,Paginator
相當於查詢建構器或Eloquent 的simplePaginate
方法,而LengthAwarePaginator
相當於paginate
方法。
{note} 在手動建立分頁實例時,需要人為 「切割」 傳遞給分頁實例的結果陣列。如果你對此沒有把握,請參考 PHP 的 array_slice 函數。
顯示結果集
當呼叫paginate
方法時,會得到Illuminate\Pagination\LengthAwarePaginator
實例。呼叫 simplePaginate
方法,得到的是 Illuminate\Pagination\Paginator
實例。這些物件提供了分析結果集的幾個方法。除了這些輔助方法,分頁器實例合為迭代器,可以像陣列一樣循環。因此,當得到結果後,可以使用 Blade 顯示資料、渲染分頁連結:
<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
links
方法渲染結果集中剩餘頁面的連結。每個連結都包含 page
URL 變數。記住, links
產生的 HTML 相容 Bootstrap CSS 框架。
自訂分頁器 URI
withPath
方法允許你在生成分頁連結時自訂 URI 。例如,如果你想產生形如 http://example.com/custom/url?page=N
的分頁鏈接,只需要傳遞custom/url
參數給 withPath
方法:
Route::get('users', function () { $users = App\User::paginate(15); $users->withPath('custom/url'); // });
附加參數到分頁連結
可以使用appends
方法,將查詢參數新增至分頁連結。例如,要在每頁連結中新增sort=votes
,只需要這樣呼叫appends
:
{{ $users->appends(['sort' => 'votes'])->links() }}
如果想要向分頁器URL 新增「哈希片段”,可以使用fragment
方法。例如,要在每頁連結中新增 #foo
,只要這樣呼叫 fragment
方法:
{{ $users->fragment('foo')->links() }}
調整分頁連結視窗
你能夠控制在分頁器的 「視窗」 的每一邊顯示多少個附加連結。預設情況下,主分頁連結的每側顯示三個連結。可以使用onEachSide
方法改變這個數值:
{{ $users->onEachSide(5)->links() }}
將結果轉換為JSON
# Laravel 分頁器類別實作了Illuminate\Contracts\Support\Jsonable
介面契約,提供了toJson
方法,能夠方便地將分頁結果轉換為JSON 。也可以透過自路由或控制器操作返回分頁器實例來將其轉換為JSON :
Route::get('users', function () { return App\User::paginate(); });
來自分頁器的JSON 將包括諸如total
, current_page
, last_page
等元資料資訊。實際結果物件將透過 JSON 陣列的 data
鍵提供。以下是透過自路由中傳回分頁器實例的方式建立JSON 的範例:
{ "total": 50, "per_page": 15, "current_page": 1, "last_page": 4, "first_page_url": "http://laravel.app?page=1", "last_page_url": "http://laravel.app?page=4", "next_page_url": "http://laravel.app?page=2", "prev_page_url": null, "path": "http://laravel.app", "from": 1, "to": 15, "data":[ { // 结果集对象 }, { // 结果集对象 } ] }
自訂分頁視圖
#預設情況下,渲染視圖以顯示分頁連結與Bootstrap CSS 框架相容。如果你不使用 Bootstrap,可以隨心所欲地自訂自己的視圖來渲染這些連結。在呼叫分頁器實例的links
方法時,將視圖名稱作為傳遞給它的第一個參數:
{{ $paginator->links('view.name') }} // Passing data to the view... {{ $paginator->links('view.name', ['foo' => 'bar']) }}
自訂分頁視圖的最簡方法是使用vendor :publish
指令將它們輸出到resources/views/vendor
資料夾:
php artisan vendor:publish --tag=laravel-pagination
此指令將在resources/views/vendor/pagination
資料夾放置這些視圖。內建在該資料夾下的 bootstrap-4.blade.php
檔案提供了預設的分頁視圖。可以編輯此文件以修改分頁 HTML。
如果想要定義不同的檔案作為預設分頁視圖,需要在AppServiceProvider
中使用分頁器的defaultView
和defaultSimpleView
方法:
use Illuminate\Pagination\Paginator;public function boot(){ Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name'); }#
分頁器實例方法
每個分頁器實例提供如下方法取得附加的分頁資訊::
方法 | 描述 |
---|---|
#$results->count() | 取得目前頁資料數量。 |
$results->currentPage() | 取得目前頁頁碼。 |
$results->firstItem() | 取得結果集中第一條資料的結果編號。 |
$results->getOptions() | #取得分頁器選項。 |
$results->getUrlRange($start, $end) | 建立分頁 URL 範圍。 |
$results->hasMorePages() | 是否有多頁。 |
$results->lastItem() | #取得結果集中最後一條資料的結果編號。 |
$results->lastPage() | 取得最後一頁的頁碼(在simplePaginate 中無效) 。 |
$results->nextPageUrl() | 取得下一頁的 URL 。 |
$results->onFirstPage() | 目前而是否為第一頁。 |
$results->perPage() | #每頁的資料條數。 |
$results->previousPageUrl() | 取得前一頁的 URL。 |
$results->total() | #資料總數(在 simplePaginate 無效)。 |
$results->url($page) | 取得指定頁的 URL。 |