[TOC]
# 分頁
## 基本用法
### 查詢構造器分頁
`paginate`方法根據用戶瀏覽的當前頁碼,自動設置恰當的偏移量 offset 和限制數 limit。默認情況下,HTTP 請求中的`page`查詢參數值被當作當前頁的頁碼。Lavarel 自動偵測該值,并自動將其插入到分頁器生成的鏈接中。
```
// 傳遞給 paginate 方法的唯一參數是每頁顯示的記錄條數。
<?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]);
}
}
```
>[success] 注意:目前,Lavarel 無法高效地執行使用了`groupBy`語句的分頁操作。如果你需要使用對使用了`groupBy`的結果集分頁,建議你手工查詢數據庫并創建分頁。
### 簡單分頁
```
// 只顯示『下一頁』和『上一頁』鏈接
// 在數據多且不需要在渲染視圖時顯示每頁的頁碼時非常有用
$users = DB::table('users')->simplePaginate(15);
```
### Eloquent 分頁
```
// 每頁 15 條分頁
$users = App\User::paginate(15);
// 查詢條件
$users = User::where('votes', '>', 100)->paginate(15);
// 使用 simplePaginate 方法
$users = User::where('votes', '>', 100)->simplePaginate(15);
```
### 手動創建分頁
有時你可能希望手動創建分頁,并傳遞一個數組集給它。可以通過創建`Illuminate\Pagination\Paginator`或`Illuminate\Pagination\LengthAwarePaginator`實例來實現,這有賴于你的需要。
`Paginator`類不需要知道結果集的總數;但是,這樣一來,這個類就沒辦法獲知最后一頁的索引。`LengthAwarePaginator`接受和`Paginator`幾乎相同的參數;不過,它會計算結果集的總數。
換句話說,`Paginator`相當于 查詢構造器 或 Eloquent 的`simplePaginate`方法,而`LengthAwarePaginator`相當于`paginate`方法。
> 注意:在手動創建分頁實例時,需要人為 “切割” 傳遞給分頁實例的結果數組。如果你對此沒有把握,請參考 PHP 的[array_slice](https://secure.php.net/manual/en/function.array-slice.php)函數。
## 顯示結果集調用
`paginate`方法時,會得到`Illuminate\Pagination\LengthAwarePaginator`實例。調用`simplePaginate`方法,得到的是`Illuminate\Pagination\Paginator`實例。
```
<div class="container">
@foreach ($users as $user)
{{ $user->name }}
@endforeach
</div>
// links 方法渲染結果集中剩余頁面的鏈接。
// 每個鏈接都包含 page URL 變量。
// links 生成的 HTML 兼容 Bootstrap CSS 框架。
{{ $users->links() }}
```
### 自定義分頁器 URI
```
// 生成類似 http://example.com/custom/url?page=N 的分頁鏈接
Route::get('users', function () {
$users = App\User::paginate(15);
$users->withPath('custom/url');
//
});
```
### 附加參數到分頁鏈接
```
// 添加參數 sort=votes
{{ $users->appends(['sort' => 'votes'])->links() }}
// 添加錨點 #foo
{{ $users->fragment('foo')->links() }}
```
### 調整分頁鏈接窗口
```
// 調整顯示分頁鏈接數量,兩側默認為三個
{{ $users->onEachSide(5)->links() }}
```
### 將結果轉換為 JSON
```
Route::get('users', function () {
return App\User::paginate();
});
{
"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":[
{
// 結果集對象
},
{
// 結果集對象
}
]
}
```
## 自定義分頁視圖
```
// 指定分頁視圖
{{ $paginator->links('view.name') }}
// 設置參數
{{ $paginator->links('view.name', ['foo' => 'bar']) }}
```
自定義分頁視圖的最簡方法是使用`vendor:publish`命令將它們輸出到`resources/views/vendor`文件夾,編輯默認的分頁視圖`bootstrap-4.blade.php`文件。
```
$ php artisan vendor:publish --tag=laravel-pagination
```
如果想要定義不同的文件作為默認分頁視圖,需要在`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。
- 入門指南
- 安裝
- 部署
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 腳手架
- 編譯資源 Mix
- 安全相關
- 用戶認證
- API 認證
- 綜合話題
- 命令行
- 廣播
- 緩存
- 集合
- 事件
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 速查表
- Artisan
- Auth
- Blade
- Cache
- Collection
- Composer
- Config
- Container
- Cookie
- DB
- Environment
- Event
- File
- Helper
- Input
- Lang
- Log
- Model
- Pagination
- Queue
- Redirect
- Request
- Response
- Route
- SSH
- Schema
- Security
- Session
- Storage
- String
- URL
- UnitTest
- Validation
- View