Pagination Trong Laravel Là Gì?

Pagination Trong Laravel Là Gì?
Laravel Pagination giúp cho việc phân trang nhanh chóng, dễ dàng và thuận tiện khi các bạn xây dựng các truy vấn trong nhiều sản phẩm.

Trong các framework bên ngoài, phân trang rất mệt. Nhưng với Laravel, hệ thống đã tự động tích hợp với Query Builder và Eloquent ORM. Cách này đơn giản và thuận tiện. Vì mã HTML sinh ra nằm tương ứng với Bootstrap CSS framework. 

 

Giới thiệu sơ lược về Pagination trong Laravel

 

Pagination là một dạng class trong Laravel core và có chức năng hỗ trợ phân trang dữ liệu khi trang dữ liệu được trả về trong Database. Database đó có thể là Query, Builder hoặc Eloquent ORM. 

 

Class này đơn giản và linh hoạt. Đa số các framework hiện tại mặc định lại không có hỗ trợ, Pagination trong Laravel có ưu thế hơn. Mặc định Pagination trong Laravel sẽ dùng Taiwind CSS framework và chúng ta có thể thay đổi nhanh gọn. 

 

Sử dụng Pagnation như thế nào? 

 

Đối với Quey Builder 

 

Để phân trang kết quả trả về trong Query Builder, chúng ta nên sử dụng phương thức Paginate và kết hợp với cú pháp như sau: 

 

paginate($perPage, $columns, $pageName, $page);

 

  • $perPage: số lượng item mà các bạn sẽ lấy ra và nó sẽ hiển thị trên từng trang. Thông thường, nó sẽ có 15 item trên mỗi trang
  • $columns: các cột mà các bạn sẽ lấy ra trong database. Thông thường, các bạn sẽ lấy mặc định toàn bộ các cột trong database (SELECT*)
  • $pageName: tên của Query String mà nó sẽ chứa tham số page number. Mặc định cú pháp sẽ là $pageName = 'page' 
  • $page: item mà các bạn muốn lấy ra (nằm ở trang số mấy). Nếu page là null thì Laravel sẽ xử lý theo dữ liệu của page Query String. Mặc định cú pháp của nó sẽ là $page = null. 

 

Hãy xem phân trang 5 User trong bảng users một trang như sau:

 

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

use Illuminate\Support\Facades\DB;

class UserController extends Controller

{

    /**

     * Show all of the users for the application.

     *

     * @return  \Illuminate\Http\Response

     */

    public function index()

    {

        return view('user.index', [

            'users' => DB::table('users')->paginate(5)

        ]);

    }

}

 

Nếu bạn muốn sử dụng Pagination ở dạng đơn giản hơn, thì bạn nên dùng 2 button (previous và next). Khi đó, bạn kết hợp với phương thức simplePaginate với cú pháp tương tự như phương thức paginate.

 

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

 

Đối với Eloquent ORM

 

Nếu bạn muốn sử dụng Eloquent, thì cú pháp và phương thức cũng tương tự như với Query Builder. 

 

use App\Models\User;

$users = User::paginate(15);

// hoặc

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

 

Cách tự tạo ra phân trang thủ công

 

Nếu dữ liệu của bạn là dạng không thể trả về từ Query Builder hoặc Eloquent ORM, thì bạn có thể dùng 2 class thay thế này: Illuminate\Pagination\Paginator hoặc Illuminate\Pagination\LengthAwarePaginator. Khi đó, cú pháp của bạn sẽ như thế này để tạo ra Pagination trong Laravel. 

 

use Illuminate\Pagination\Paginator;

$paginate = new Paginator($items, $perPage, $currentPage, $options);

// hooặc

use Illuminate\Pagination\LengthAwarePaginator;

 

  • $paginate = new LengthAwarePaginator($items, $total, $perPage, $currentPage, $options);
  • $item: mảng dữ liệu mà bạn cần phải phân định trang rõ ràng
  • $total: tổng số bản ghi có trong item
  • $perPage: số lượng item mà bạn sẽ lấy ra và muốn nó hiển thị rõ trên mỗi trang
  • $currentPage: trang dữ liệu mà bạn muốn lấy ra hiện tại. Mặc định của nó sẽ là $currentPage = null. 
  • $option: các tham số cấu hình thêm cho Pagination. Mặc định của nó sẽ là $options = []

 

Ở Paginator không có tham số $total vì lớp này cũng tương tự như với simplePaginate. Do đó, nó không nhất thiết phải lấy ra tổng số lượng item trong mảng. Còn với LengthAwarePaginator, nó có cú pháp tương tự Paginate nên nó cần phải lấy tổng số item để tính toán và hiển thị chính xác. Ví dụ như sau:

 

$students = [

    ['name' => 'Lo thi vi song'],

    ['name' => 'Tran Nhu Nhong'],

    ['name' => 'Son Tung MTP'],

    ['name' => 'Tung Son Ido'],

];

$paginate = new \Illuminate\Pagination\Paginator($students, 2);

 

Custom Pagination URL

 

Laravel sẽ sử dụng đường dẫn hiện tại để làm URL paginate. Trong trường hợp bạn muốn thay đổi thì bạn nên dùng phương thức withPath để thay URL theo mong muốn của bạn. Hãy xem ví dụ đổi paginate URL từ /users thành admin/users.

 

Route::get('/users', function () {

    $users = User::paginate(15);

    $users->withPath('/admin/users');

    //

});

 

Nếu phần logic pagination cần thêm vào một số tham số trong URL, thì bạn có thể áp dụng phương thức append để thêm Query String vào URL. Ví dụ thêm tham số sort vào trong URL pagination như sau:

 

use App\Models\User;

Route::get('/users', function () {

    $users = User::paginate(15);

    $users->appends(['sort' => 'votes']);

    //

});

 

Ngoài ra, bạn có thể dùng phương thức withQueryString để thêm toàn bộ Query String trên URL hiện tại vào trong Paginate. 

 

$users = User::paginate(15)->withQueryString();

 

Bạn cũng có thể thêm hash fragment vào cuối URL trong Pagination qua phương thức fragment. Ví dụ thêm #users vào cuối URL

 

$users = User::paginate(15)->fragment('users');

 

Cách hiển thị Pagination Data

 

Khi đã lấy dữ liệu cần phân trang, bạn cần thực hiện thao tác hiển thị chúng ra view. Nếu bạn dùng phương thức Paginate thì Laravel sẽ tự động trả về LengthAwarePaginator và simplePaginate sẽ trả về Paginator. Cả 2 phương thức này đều trả kết quả về như nhau. Khi đó, bạn có thể lặp lại dữ liệu như array bình thường. Ví dụ cách hiển thị data paginate trong Blade.

 

<div class="container">

    addLoop($__currentLoopData); foreach($__currentLoopData as $user): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>

        


    popLoop(); $loop = $__env->getLastLoop(); ?>

</div>

 

Phương thức links là phương thức sẽ render ra view data và hiển thị các danh sách page. Nếu bạn return luôn một pagination, thì Laravel tự động convert nó về lại dạng JSON. Điều này hỗ trợ cho các bạn trong việc thực hiện API. JSON object sẽ có dạng như sau:

 

{

   "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":[

        {

            // Record...

        },

        {

            // Record...

        }

   ]

}

 

Trong trường hợp bạn không muốn dùng pagination view (loại mặc định của Laravel), bạn có quyền chỉ định view khác hoặc tạo view theo ý của bạn. Để thay view, hãy truyền view name trong phương thức links. 

 




// Hoặc muốn truyền thêm data vào view

 

Bạn cũng có thể export các view mặc định command vendor:publish  của Laravel ( ra thư mục riêng với tham số --tag=laravel-pagination. 

Ngọc Nguyễn

Hãy viết code như thể người maintain là một đứa sát nhân điên cuồng biết địa chỉ nhà bạn.

Bình luận (0)