Mặc định pagination của Laravel tương thích với Tailwind CSS framework, tuy nhiên Bootstrap pagination cũng được hỗ trợ.
Cơ bản:
Phân trang với Query builder:
Sử dụng method paginate, page hiện tại được xác định bằng tham số page query string. Ví dụ:
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;
class UserController extends Controller
{
/**
* Show all application users.
*/
public function index(): View
{
return view('user.index', [
'users' => DB::table('users')->paginate(15)
]);
}
}Simple pagination:
Method paginate đếm tổng số bản ghi khớp với query. Paginator sẽ tự biết được có bao nhiêu page. Nếu bạn không cần show toàn bộ số page trong view, count query sẽ không cần thiết. Do vậy nếu chỉ cần hiển thị “Next” và “Previous” link, sử dụng method simplePaginate để tối ưu query hơn:
$users = DB::table('users')->simplePaginate(15);Eloquent Pagination:
use App\Models\User;
$users = User::paginate(15);Sử dụng pagniate sau ràng buộc query:
$users = User::where('votes', '>', 100)->simplePaginate(15);Tương tự bạn có thể dùng cursorPaginate method để con trỏ paginate Eloquent model:
$users = User::where('votes', '>', 100)->cursorPaginate(15);Nhiều phân trang instance trong 1 page:
Thi thoảng bạn cần render 2 phân trang khác nhau trong 1 page, tuy nhiên cả 2 phân trang sử dụng cùng query string page sẽ dẫn đến xung đột. Để xử lý, cần pass tên query string mà bạn muốn dùng để lưu current page thông qua tham số thứ 3:
use App\Models\User;
$users = User::where('votes', '>', 100)->paginate(
$perPage = 15, $columns = ['*'], $pageName = 'users'
);Con trỏ phân trang:
Method paginate và simplePaginate sử dụng “offset” SQL, cursor pagination sử dụng “where” so sánh giá trị của các cột được sắp xếp có trong truy vấn, cung cấp hiệu năng tốt hơn. Cách phân trang này phù hợp với lượng db lớn hoặc kiểu giao diện scroll. Cursor paginate đặt 1 “cursor” string trong query string. Cursor là 1 string đã được encode chứa location mà query phân trang tiếp theo sẽ bắt đầu và hướng phân trang:
http://localhost/users?cursor=eyJpZCI6MTUsIl9wb2ludHNUb05leHRJdGVtcyI6dHJ1ZX0Method cursorPaginate trả về 1 instance của Illuminate\Pagination\CursorPaginator:
$users = DB::table('users')->orderBy('id')->cursorPaginate(15);Customize pagination URLs:
Sử dụng method withPath để customize URI. Ví dụ muốn tạo link example.com/admin/users?page=N:
use App\Models\User;
Route::get('/users', function () {
$users = User::paginate(15);
$users->withPath('/admin/users');
});Append query string: ví dụ append sort=votes vào mỗi pagination link:
use App\Models\User;
Route::get('/users', function () {
$users = User::paginate(15);
$users->appends(['sort' => 'votes']);
// ...
});Bạn có thể dùng method withQueryString để append tất cả query string ở request hiện tại vào pagination link:
$users = User::paginate(15)->withQueryString();Hiển thị pagination:
Khi gọi method paginate, bạn sẽ nhận được 1 instance của Illuminate\Pagination\LengthAwarePaginator, khi gọi simplePaginate sẽ nhận được 1 Illuminate\Pagination\Paginator. Gọi cursorPaginate sẽ nhận được Illuminate\Pagination\CursorPaginator.
Những object này cung cấp nhiều method để hiển thị kết quả. Sử dụng blade:
<div class="container">
@foreach ($users as $user)
{{ $user->name }}
@endforeach
</div>
{{ $users->links() }}Adjusting the pagination link windows:
Khi hiển thị pagination link, mỗi page hiện tại sẽ hiển thị link cho 3 page trước và sau. Sử dụng method onEachSide để tùy chọn số link hiển thị:
{{ $users->onEachSide(5)->links() }}