NỘI DUNG
Trong các framework khác, việc phân trang có thể khá vất vả. Phân trang của Laravel được tích hợp với query builder and Eloquent ORM và khá thuận tiện, đơn giản. Mã HTML sinh ra thì tương thích với Bootstrap CSS framework.
Sử dụng cơ bản
Phân trang kết quả từ Qurey Builder
Có vài cách để phân trang. Đơn giản nhất là sử dụng hàm paginate
trong query builder hoặc một Eloquent query. The paginate
cung cấp bởi Laravel sẽ tự động xử lý việc tạo ra limit và vị trí trang dựa trên trang hiện tại đang được xem bởi người dùng. Mặc định, trang hiện tại được nhận biết thông qua giá trị page
trên query string trên HTTP request. Dĩ nhiên là giá trị này được tự động nhận biết bởi Laravel, và cũng được tự động thêm vào các link sinh ra bởi paginator.
Trong ví dụ này, chỉ truyền một tham số của hàm paginate
là số của items bạn cần hiển thị trong “một trang”. Ở đây, chúng ta ví dụ đặt chỉ số là 15
items trên một trang:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
public function index()
{
$users = DB::table('users')->paginate(15);
return view('user.index', ['users' => $users]);
}
}
Hiện tại, việc phân trang sử dụng groupBy
chưa thể thực thi hiệu quả bởi Laravel. Nếu bạn cần sử dụng groupBy
với một tập kết quả phân trang, thì khuyến khích các bạn thực hiện query cơ sở dữ liệu và tạo một paginator thủ công.
“Phân trang đơn giản”
Nếu bạn chỉ cần hiển thị link “Next” and “Previous” trong view, bạn có thể sử dụng phương thức simplePaginate
để thực hiện một query hiệu quả hơn. Cách này rất hữu dụng với một tập dữ liệu lớn nếu bạn không cần hiển thị một link cho mỗi số trang khi thực hiện render:
$users = DB::table('users')->simplePaginate(15);
Phân trang kết quả từ Eloquent
Bạn cũng có thể phân trang kết quả từ Eloquent. Trong ví dụ này, chúng ta sẽ phân trang model User
với 15
items trong một trang. Như bạn thấy, cú pháp gần như giống hệt với phân trang kết quả từ query builder:
$users = App\User::paginate(15);
Tất nhiên, bạn cũng có thể gọi paginate
sau khi thiết lập rằng buộc trên query, ví dụ như mệnh đề where
:
$users = User::where('votes', '>', 100)->paginate(15);
Bạn cũng có thể sử dụng phương thức simplePaginate
khi phân trang với Eloquent:
$users = User::where('votes', '>', 100)->simplePaginate(15);
Tạo một Paginator
Đôi khi bạn muốn tạo một đối tượng xử lý phân trang riêng, truyền vào cho nó một mảng các items. Bạn có thể thực hiện bằng cách tạo một đối tượng từ Illuminate\Pagination\Paginator
hoặc Illuminate\Pagination\LengthAwarePaginator
phục thuộc vào yêu cầu của bạn.
Class Paginator
không quan tâm tổng số items trên tập kết quả; tuy nhiên, chính vì thế mà class không có phương thức để lấy được index của trang cuối cùng. Class LengthAwarePaginator
nhận đối số tương tự với Paginator
; nhưng lại cần biết tổng số items có trong tập kết quả.
Nói một cách khác, Paginator
tương ứng với hàm simplePaginate
trên query builder và Eloquent, trong khi LengthAwarePaginator
tương ứng với hàm paginate
.
Khi tự tạo một đối tượng paginator thủ công, bạn nên tự “cắt” mảng của tập kết quả truyền vào cho paginator. Nếu bạn không chắc làm như thế nào, hãy tham khảo hàm array_slice PHP.
Hiển thị kết quả trong views
Khi bạn gọi hàm paginate
, bạn sẽ nhận được một đối tượngIlluminate\Pagination\LengthAwarePaginator
. Khi bạn gọi hàm simplePaginate
bạn sẽ nhận được một đối tượng Illuminate\Pagination\Paginator
. Những đối tượng này cung cấp vài phương thức mô tả tập kết quả. Ngoài những phương thức này, các đối tượng paginator đều là các iterators và có thể được lặp như một mảng. Vì vậy, khi bạn đã nhận được kết quả, bạn có thể hiển thị kết quả và render vào page sử dụng Blade:
<div class="container">
@foreach ($users as $user)
{{ $user->name }}
@endforeach
</div>
{{ $users->links() }}
Hàm links
sẽ render các link cho tới hết các trang trong tập kết quả. Mỗi link này đều chứa sẵn một tham số page
với giá trị đúng. Nhớ rằng, mã HTML sinh ra bởi hàm links
tương thích với Bootstrap CSS framework.
Tuỳ biến The Paginator URI
Hàm setPath
cho phép bạn tuỳ chọn URI sử dụng bởi paginator khi sinh ra links. Ví dụ, nếu bạn muốn paginator sinh ra links theo kiểu này http://example.com/custom/url?page=N
, bạn chỉ cần truyền custom/url
vào hàm setPath
:
Route::get('users', function () {
$users = App\User::paginate(15);
$users->setPath('custom/url');
});
Thêm vào link phân trang
Bạn có thể thêm vào query string của link phân trang sử dụng hàm appends
. Ví dụ, để thêm vào sort=votes
vào mỗi link, bạn nên thực hiện gọi appends
như sau:
{{ $users->appends(['sort' => 'votes'])->links() }}
Nếu bạn muốn thêm vào “hash fragment” vào URL của paginator, bạn có thể sử dụng hàm fragment
. Ví dụ, để thêm #foo
vào cuối mỗi link phân trang, gọi hàm fragment
:
{{ $users->fragment('foo')->links() }}
Chuyển kết quả sang JSON
Các lớp kết quả phân trang của Laravel triển khai từ contract Illuminate\Contracts\Support\Jsonable
và mở ra hàm toJson
, do đó, rất dễ dàng để có thể chuyển kết quả thành. Bạn cũng có thể convert một đối tượng paginator sang JSON bằng cách return nó từ một route hay controller action:
Route::get('users', function () {
return App\User::paginate();
});
JSON tạo ra từ paginator sẽ chứa các thông tin meta như total
, current_page
, last_page
, và nhiều nữa. Các đối tượng kết quả đều có trong khoá data
của mảng JSON. Đây là một ví dụ về JSON tạo bởi paginator từ một route:
{
"total": 50,
"per_page": 15,
"current_page": 1,
"last_page": 4,
"next_page_url": "http://laravel.app?page=2",
"prev_page_url": null,
"from": 1,
"to": 15,
"data":[
{
// Result Object
},
{
// Result Object
}
]
}
Tùy biến phân trang trong view
Mặc định, views rendered để hiển thị link phân trang tương thích với Bootstrap CSS framework. Tuy nhiên, nếu bạn không sử dụng Bootstrap, bạn có thể tự định nghĩa views cho chính bạn để render những link đó. Khi gọi hàm links
trong một paginator instance, truyền vào tên view là đối số thứ nhất:
{{ $paginator->links('view.name') }}
nhiên, cách dễ nhất để tùy biến phân trang trong view là tạo ra trong thư mục resources/views/vendor
bằng lệnh vendor:publish
:
php artisan vendor:publish --tag=laravel-pagination
Lệnh này sẽ đặt các view ở trong thư mục resources/views/vendor/pagination
. File default.blade.php
trong đường dẫn tương ứng với phân trang của view mặc định. Và rất đơn giản để thay đổi file HTML.
Paginator Instance Methods
Mỗi paginator instance cung cấp các thông tin khác trong phân trang thông qua các phương thức sau:
$results->count()
$results->currentPage()
$results->firstItem()
$results->hasMorePages()
$results->lastItem()
$results->lastPage() (Not available when using simplePaginate)
$results->nextPageUrl()
$results->perPage()
$results->previousPageUrl()
$results->total() (Not available when using simplePaginate)
$results->url($page)
buy cialis uk In humans, a previous study reported a significant correlation between inflammation and the course of heart disease 22