Giao diện
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 trangPaginating 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() }}Điều chỉnh Link Window
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-paginationSử dụng Bootstrap
php
use Illuminate\Pagination\Paginator;
// Trong AppServiceProvider::boot()
Paginator::useBootstrapFive();
Paginator::useBootstrapFour();Paginator Methods
| Method | Mô 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ể |