-後端資料分頁和前端顯示分頁結果

NO IMAGE

1、簡介

在其他框架中,分頁是件非常痛苦的事,Laravel的分頁器整合了查詢構建器Eloquent ORM,並且開箱提供了方便的、易於使用的、基於資料庫結果集的分頁。分頁器生成的HTML相容Bootstrap
CSS 框架

2、基本使用

基於查詢構建器進行分頁

有多種方式實現分頁,最簡單的方式就是使用查詢構建器或Eloquent模型的paginate方法。該方法基於當前使用者檢視頁自動設定合適的偏移(offset)和限制(limit)。預設情況下,當前頁通過HTTP請求查詢字串引數?page的值判斷。當然,該值由Laravel自動檢測,然後自動插入分頁器生成的連結中。

讓我們先來看看如何在查詢上呼叫paginate方法。在本例中,傳遞給paginate的唯一引數就是你每頁想要顯示的數目,這裡我們指定每頁顯示15個:

<?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方法來執行一個更加高效的查詢。在渲染包含大資料集的檢視且不需要顯示每個頁碼時這一功能非常有用:

$users = DB::table('users')->simplePaginate(15);

基於Eloquent結果集進行分頁

你還可以對Eloquent查詢結果進行分頁,在本例中,我們對User模型進行分頁,每頁顯示15條記錄。正如你所看到的,該語法和基於查詢構建器的分頁差不多:

$users = App\User::paginate(15);

當然,你可以在設定其它約束條件之後呼叫paginate,比如where子句:

$users = User::where('votes', '>', 100)->paginate(15);

在對Eloquent模型進行分頁時你也可以使用simplePaginate方法:

$users = User::where('votes', '>', 100)->simplePaginate(15);

手動建立分頁器

有時候你可能想要通過傳遞陣列資料來手動建立分頁例項,你可以基於自己的需求通過建立Illuminate\Pagination\PaginatorIlluminate\Pagination\LengthAwarePaginator例項來實現。

Paginator類不需要知道結果集中資料項的總數;不過,正因如此,該類也沒有提供獲取最後一頁索引的方法。

LengthAwarePaginator接收引數和Paginator幾乎一樣,只是,它要求傳入結果集的總數。

換句話說,Paginator 對應simplePaginate方法,而LengthAwarePaginator對應paginate方法。

注:當手動建立分頁器例項的時候,應該手動對傳遞到分頁器的結果集進行“切片”,如果你不確定怎麼做,檢視PHP函式array_slice

3、顯示分頁結果

當呼叫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 框架

自定義分頁連結

setPath方法允許你生成分頁連結時自定義分頁器使用的URI,例如,如果你想要分頁器生成形如http://example.com/custom/url?page=N的連結,應該傳遞custom/urlsetPath方法:

Route::get('users', function () {
$users = App\User::paginate(15);
$users->setPath('custom/url');
//
});

新增引數到分頁連結

你可以使用appends方法新增查詢引數到分頁連結查詢字串。例如,要新增&sort=votes到每個分頁連結,應該像如下方式呼叫appends

{{ $users->appends(['sort' => 'votes'])->links() }}

如果你想要新增”雜湊片段”到分頁連結,可以使用fragment方法。例如,要新增#foo到每個分頁連結的末尾,像這樣呼叫fragment方法:

{{ $users->fragment('foo')->links() }}

將結果轉化為JSON

Laravel分頁器結果類實現了Illuminate\Contracts\Support\JsonableInterface契約並提供了toJson方法,所以將分頁結果轉化為JSON非常簡單。你還可以簡單通過從路由或控制器動作返回分頁器例項將轉其化為JSON:

Route::get('users', function () {
return App\User::paginate();
});

從分頁器轉化來的JSON包含了元資訊如totalcurrent_pagelast_page等等,實際的結果物件資料可以通過該JSON陣列中的data鍵訪問。下面是一個通過從路由返回的分頁器例項建立的JSON例子:

{
"total": 50,
"per_page": 15,
"current_page": 1,
"last_page": 4,
"next_page_url": "http://laravel.app?page=2",
"prev_page_url": null,
"from": 1,
"to": 15,
"data":[
{
// Result Object
},
{
// Result Object
}
]
}

4、自定義分頁檢視

預設情況下,用於渲染分頁連結的檢視相容於Bootstrap CSS框架,如果你沒有使用Bootstrap,可以自定義檢視來渲染這些連結。當呼叫分頁器例項上的links方法時,傳遞檢視名稱作為第一個引數:

{{ $paginator->links('view.name') }}

不過,自定義分頁檢視最簡單的方式是使用vendor:publish命令匯出檢視檔案到resources/views/vendor目錄:

php artisan vendor:publish --tag=laravel-pagination

該命令會將檢視放到resources/views/vendor/pagination目錄,該目錄下的default.blade.php檔案對應預設的檢視檔案,編輯該檔案即可修改分頁HTML。

5、分頁器例項方法

每個分頁器例項都可以通過以下方法提供更多分頁資訊:

  • $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)