Skip to content

Pagination (Phân trang)

Giới thiệu (Introduction)

Trong nhiều frameworks, pagination cực kỳ khó chịu. Laravel cung cấp pagination tích hợp với query builder và Eloquent ORM — tự động xử lý limit, offset dựa trên trang hiện tại.

Sử dụng cơ bản (Basic Usage)

Paginating Query Builder Results

php
use Illuminate\Support\Facades\DB;

$users = DB::table('users')->paginate(15);
// 15 items mỗi trang

Paginating Eloquent Results

php
use App\Models\User;

$users = User::paginate(15);

// Có điều kiện
$users = User::where('votes', '>', 100)->paginate(15);

Simple Pagination

Chỉ hiển thị "Next" và "Previous" (không có page numbers — hiệu quả hơn):

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

Cursor Pagination

Dùng cursors thay vì offset — hiệu suất tốt hơn cho datasets lớn:

php
$users = DB::table('users')
    ->orderBy('id')
    ->cursorPaginate(15);

KHI NÀO DÙNG CURSOR PAGINATION

  • Dataset rất lớn (hàng triệu records)
  • Infinite scrolling / "Load More"
  • Hiệu suất cao hơn offset pagination cho large datasets

Tạo Paginator thủ công

php
use Illuminate\Pagination\Paginator;
use Illuminate\Pagination\LengthAwarePaginator;

new Paginator($items, $perPage, $currentPage, $options);
new LengthAwarePaginator($items, $total, $perPage, $currentPage, $options);

Tùy chỉnh Pagination URLs

php
$users = User::paginate(15);

$users->withPath('/admin/users');
$users->appends(['sort' => 'votes']);
$users->appends($request->query());
$users->fragment('users');

Hiển thị kết quả Pagination

Trong Blade

blade
<div class="container">
    @foreach ($users as $user)
        {{ $user->name }}
    @endforeach
</div>

{{ $users->links() }}
blade
{{ $users->onEachSide(5)->links() }}

Chuyển đổi sang JSON

php
Route::get('/users', function () {
    return User::paginate(15);
});

JSON output:

json
{
    "total": 50,
    "per_page": 15,
    "current_page": 1,
    "last_page": 4,
    "first_page_url": "http://example.com/users?page=1",
    "last_page_url": "http://example.com/users?page=4",
    "next_page_url": "http://example.com/users?page=2",
    "prev_page_url": null,
    "path": "http://example.com/users",
    "from": 1,
    "to": 15,
    "data": [/* ... */]
}

Tùy chỉnh Pagination View

Publish Views

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

Sử dụng Bootstrap

php
use Illuminate\Pagination\Paginator;

// Trong AppServiceProvider::boot()
Paginator::useBootstrapFive();
Paginator::useBootstrapFour();

Paginator Methods

MethodMô tả
$paginator->count()Số items trang hiện tại
$paginator->currentPage()Trang hiện tại
$paginator->firstItem()Index item đầu tiên
$paginator->hasMorePages()Còn trang tiếp?
$paginator->hasPages()Có nhiều hơn 1 trang?
$paginator->items()Items trang hiện tại
$paginator->lastItem()Index item cuối
$paginator->lastPage()Trang cuối (LengthAware)
$paginator->nextPageUrl()URL trang tiếp
$paginator->perPage()Items mỗi trang
$paginator->previousPageUrl()URL trang trước
$paginator->total()Tổng items (LengthAware)
$paginator->url($page)URL trang cụ thể