php
在其餘框架中,分頁是件很是痛苦的事,Laravel 讓這件事變得簡單易於上手。Laravel 的分頁器與查詢構建器和 Eloquent ORM 集成在一塊兒,並開箱提供方便的、易於使用的、基於數據庫結果集的分頁。分頁器生成的 HTML 兼容Bootstrap CSS 框架。css
有多種方式實現分頁功能,最簡單的方式就是使用查詢構建器或 Eloquent 查詢提供的 paginate
方法。該方法基於當前用戶查看頁自動設置合適的偏移(offset)和限制(limit),直白點說就是頁碼和每頁顯示數量。默認狀況下,當前頁經過 HTTP 請求查詢字符串參數 page
的值判斷。固然,該值由 Laravel 自動檢測,而後自動插入分頁器生成的連接中。html
讓咱們先來看看如何在查詢中調用 paginate
方法。在本例中,傳遞給 paginate
的惟一參數就是你每頁想要顯示的數目,這裏咱們指定每頁顯示 15
個:laravel
<?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]); } }
注:目前,使用
groupBy
的分頁操做不能被 Laravel 有效執行,若是你須要在分頁結果中使用groupBy
,推薦你手動查詢數據庫而後建立分頁器。數據庫
簡單分頁數組
若是你只須要在分頁視圖中簡單的顯示「下一頁」和「上一頁」連接,可使用 simplePaginate
方法來執行一個更加高效的查詢。在渲染包含大數據集的視圖且不須要顯示每一個頁碼時這一功能很是有用:app
$users = DB::table('users')->simplePaginate(15);
你還能夠對 Eloquent 查詢結果進行分頁,在本例中,咱們對 User
模型進行分頁,每頁顯示 15
條記錄。正如你所看到的,該語法和基於查詢構建器的分頁差很少:框架
$users = App\User::paginate(15);
固然,你能夠在設置其它約束條件以後調用 paginate
,好比 where
子句:函數
$users = User::where('votes', '>', 100)->paginate(15);
在對 Eloquent 模型進行分頁時你也可使用 simplePaginate
方法:post
$users = User::where('votes', '>', 100)->simplePaginate(15);
有時候你可能想要經過傳遞數組數據來手動建立分頁實例,你能夠基於本身的需求經過建立Illuminate\Pagination\Paginator
或 Illuminate\Pagination\LengthAwarePaginator
實例來實現。
Paginator
類不須要知道結果集中數據項的總數;不過,正因如此,該類也沒有提供獲取最後一頁索引的方法。LengthAwarePaginator
接收參數和 Paginator
幾乎同樣,惟一不一樣在於它要求傳入結果集的總數。
換句話說,Paginator
對應 simplePaginate
方法,而 LengthAwarePaginator
對應 paginate
方法。
注:當手動建立分頁器實例的時候,應該手動對傳遞到分頁器的結果集進行「切片」,若是你不肯定怎麼作,查看 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
查詢字符串變量。記住,render
方法生成的 HTML 兼容 Bootstrap CSS 框架。
自定義分頁連接
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() }}
若是你想要添加」哈希片斷」到分頁連接,可使用 fragment
方法。例如,要添加 #foo
到每一個分頁連接的末尾,像這樣調用 fragment
方法:
{{ $users->fragment('foo')->links() }}
Laravel 分頁器結果類實現了 Illuminate\Contracts\Support\JsonableInterface
契約並提供了 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":[ { // Result Object }, { // Result Object } ] }
默認狀況下,用於渲染分頁連接的視圖兼容 Bootstrap CSS 框架,若是你沒有使用Bootstrap,能夠自定義視圖來渲染這些連接。當調用分頁器實例上的 links
方法時,傳遞視圖名稱做爲第一個參數:
{{ $paginator->links('view.name') }} // 傳遞數據到視圖... {{ $paginator->links('view.name', ['foo' => 'bar']) }}
不過,自定義分頁視圖最簡單的方式是使用 vendor:publish
命令導出視圖文件到resources/views/vendor
目錄:
php artisan vendor:publish --tag=laravel-pagination
該命令會將視圖放到 resources/views/vendor/pagination
目錄,該目錄下的default.blade.php
文件對應默認的視圖文件,編輯該文件便可修改分頁 HTML。
每一個分頁器實例均可以經過如下方法提供更多分頁信息:
$results->count() $results->currentPage() $results->firstItem() $results->hasMorePages() $results->lastItem() $results->lastPage() (使用simplePaginate 時無效) $results->nextPageUrl() $results->perPage() $results->previousPageUrl() $results->total() (使用simplePaginate 時無效) $results->url($page)