分頁


    ##簡介
  • 基本用法
    • 查詢建構器分頁
    • #Eloquent 分頁
    • ##手動建立分頁結果
    顯示分頁結果
  • 將結果轉換為JSON
    自訂分頁檢視
  • 分頁器實例方法

#

簡介

在其它框架中,分頁可能會非常痛苦。 Laravel 的分頁器將 查詢建構器 和 Eloquent ORM 結合起來,提供了方便、易用的資料庫結果集分頁。透過分頁器產生的 HTML 相容 Bootstrap CSS 框架

#基本用法

#查詢建構器分頁資料分頁有幾種方法。最簡單的是使用 查詢建構器 或 Eloquent query 的 paginate

方法。
paginate

方法根據使用者瀏覽的目前頁碼,自動設定適當的偏移量 offset 和限制數 limit。預設情況下,HTTP 請求中的 page 查詢參數值被當作目前頁的頁碼。 Lavarel 會自動偵測該值,並自動將其插入分頁器產生的連結中。 在下面的範例中,傳遞給

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]);   
      }
   }

#{note} 目前,Lavarel 無法有效率地執行使用了groupBy#語句的分頁操作。如果你需要使用對使用了

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 相當於查詢建構器或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 中使用分頁器的defaultViewdefaultSimpleView 方法:

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。
本篇首發在 LearnKu.com 網站上。