Trong các khuôn khổ khác, phân trang có thể rất đau đớn. Chúng tôi hy vọng cách tiếp cận phân trang của Laravel sẽ là một luồng gió mới. Trình phân trang của Laravel được tích hợp với trình tạo truy vấn và Eloquent ORM và cung cấp khả năng phân trang thuận tiện, dễ sử dụng cho các bản ghi cơ sở dữ liệu mà không cần cấu hình
Theo mặc định, HTML do trình phân trang tạo tương thích với khung CSS Tailwind;
gió đuôi JIT
Nếu bạn đang sử dụng chế độ xem phân trang Tailwind mặc định của Laravel và công cụ JIT Tailwind, thì bạn nên đảm bảo rằng tệp
$users = DB::table['users']->simplePaginate[15];
2 của tệp $users = DB::table['users']->simplePaginate[15];
3 của ứng dụng của bạn tham chiếu đến chế độ xem phân trang của Laravel để các lớp Tailwind của chúng không bị xóa './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
Sử dụng cơ bản
Kết quả trình tạo truy vấn phân trang
Có một số cách để phân trang các mục. Đơn giản nhất là sử dụng phương pháp
$users = DB::table['users']->simplePaginate[15];
4 trên trình tạo truy vấn hoặc truy vấn Eloquent. Phương thức $users = DB::table['users']->simplePaginate[15];
4 tự động đảm nhiệm việc đặt "giới hạn" và "độ lệch" của truy vấn dựa trên trang hiện tại đang được người dùng xem. Theo mặc định, trang hiện tại được phát hiện bởi giá trị của đối số chuỗi truy vấn $users = DB::table['users']->simplePaginate[15];
6 trên yêu cầu HTTP. Giá trị này được Laravel tự động phát hiện và cũng được tự động chèn vào các liên kết do trình phân trang tạo raTrong ví dụ này, đối số duy nhất được truyền cho phương thức
$users = DB::table['users']->simplePaginate[15];
4 là số mục bạn muốn hiển thị "trên mỗi trang". Trong trường hợp này, hãy xác định rằng chúng tôi muốn hiển thị $users = DB::table['users']->simplePaginate[15];
8 mục trên mỗi trang________số 8Phân trang đơn giản
Phương thức
$users = DB::table['users']->simplePaginate[15];
4 đếm tổng số bản ghi khớp với truy vấn trước khi truy xuất bản ghi từ cơ sở dữ liệu. Điều này được thực hiện để người đánh số trang biết tổng cộng có bao nhiêu trang bản ghi. Tuy nhiên, nếu bạn không định hiển thị tổng số trang trong giao diện người dùng của ứng dụng thì truy vấn đếm bản ghi là không cần thiếtDo đó, nếu bạn chỉ cần hiển thị các liên kết "Tiếp theo" và "Trước đó" đơn giản trong giao diện người dùng của ứng dụng, bạn có thể sử dụng phương pháp
$users = DB::table['users']->simplePaginate[15];
00 để thực hiện một truy vấn đơn lẻ hiệu quả$users = DB::table['users']->simplePaginate[15];
Phân trang kết quả hùng hồn
Bạn cũng có thể phân trang các truy vấn Eloquent. Trong ví dụ này, chúng tôi sẽ phân trang mô hình
$users = DB::table['users']->simplePaginate[15];
01 và cho biết rằng chúng tôi dự định hiển thị 15 bản ghi trên mỗi trang. Như bạn có thể thấy, cú pháp gần giống với kết quả của trình tạo truy vấn phân trang$users = DB::table['users']->simplePaginate[15];
0Tất nhiên, bạn có thể gọi phương thức
$users = DB::table['users']->simplePaginate[15];
4 sau khi đặt các ràng buộc khác cho truy vấn, chẳng hạn như mệnh đề $users = DB::table['users']->simplePaginate[15];
03$users = DB::table['users']->simplePaginate[15];
6Bạn cũng có thể sử dụng phương pháp
$users = DB::table['users']->simplePaginate[15];
00 khi phân trang các mô hình Eloquent$users = DB::table['users']->simplePaginate[15];
8Tương tự, bạn có thể sử dụng phương thức
$users = DB::table['users']->simplePaginate[15];
05 để phân trang con trỏ cho các mô hình Eloquent './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
0Nhiều phiên bản Paginator trên mỗi trang
Đôi khi, bạn có thể cần hiển thị hai trình phân trang riêng biệt trên một màn hình do ứng dụng của bạn hiển thị. Tuy nhiên, nếu cả hai phiên bản của trình phân trang đều sử dụng tham số chuỗi truy vấn
$users = DB::table['users']->simplePaginate[15];
6 để lưu trữ trang hiện tại thì hai phiên bản của trình phân trang sẽ xung đột. Để giải quyết xung đột này, bạn có thể chuyển tên của tham số chuỗi truy vấn mà bạn muốn sử dụng để lưu trữ trang hiện tại của trình phân trang thông qua đối số thứ ba được cung cấp cho các phương thức $users = DB::table['users']->simplePaginate[15];
4, $users = DB::table['users']->simplePaginate[15];
00 và $users = DB::table['users']->simplePaginate[15];
05 './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
5Phân trang con trỏ
Trong khi
$users = DB::table['users']->simplePaginate[15];
4 và $users = DB::table['users']->simplePaginate[15];
00 tạo các truy vấn bằng cách sử dụng mệnh đề "offset" của SQL, phân trang con trỏ hoạt động bằng cách xây dựng các mệnh đề "where" so sánh các giá trị của các cột được sắp xếp có trong truy vấn, cung cấp hiệu suất cơ sở dữ liệu hiệu quả nhất có sẵn trong tất cả các phương thức phân trang của Laravel. Phương pháp phân trang này đặc biệt phù hợp với tập dữ liệu lớn và giao diện người dùng cuộn "vô hạn"Không giống như phân trang dựa trên độ lệch, bao gồm số trang trong chuỗi truy vấn của các URL được tạo bởi trình phân trang, phân trang dựa trên con trỏ đặt một chuỗi "con trỏ" trong chuỗi truy vấn. Con trỏ là một chuỗi được mã hóa chứa vị trí mà truy vấn được phân trang tiếp theo sẽ bắt đầu phân trang và hướng truy vấn sẽ phân trang
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
8Bạn có thể tạo một phiên bản trình phân trang dựa trên con trỏ thông qua phương thức
$users = DB::table['users']->simplePaginate[15];
05 do trình tạo truy vấn cung cấp. Phương thức này trả về một thể hiện của $users = DB::table['users']->simplePaginate[15];
63$users = DB::table['users']->simplePaginate[15];
1Sau khi bạn đã truy xuất một phiên bản trình phân trang con trỏ, bạn có thể thực hiện như thường lệ khi sử dụng các phương thức
$users = DB::table['users']->simplePaginate[15];
4 và $users = DB::table['users']->simplePaginate[15];
00. Để biết thêm thông tin về các phương thức cá thể được cung cấp bởi trình phân trang con trỏ, vui lòng tham khảoCảnh báo
Truy vấn của bạn phải chứa mệnh đề "sắp xếp theo thứ tự" để tận dụng tính năng phân trang của con trỏ.
Con trỏ so với. Phân trang bù đắp
Để minh họa sự khác biệt giữa phân trang offset và phân trang con trỏ, hãy xem xét một số truy vấn SQL mẫu. Cả hai truy vấn sau đây đều sẽ hiển thị "trang thứ hai" của kết quả cho bảng
$users = DB::table['users']->simplePaginate[15];
66 được sắp xếp theo thứ tự của $users = DB::table['users']->simplePaginate[15];
67namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
0Truy vấn phân trang con trỏ cung cấp các ưu điểm sau so với phân trang bù
- Đối với các tập dữ liệu lớn, phân trang con trỏ sẽ mang lại hiệu suất tốt hơn nếu các cột "sắp xếp theo" được lập chỉ mục. Điều này là do mệnh đề "offset" quét qua tất cả dữ liệu đã khớp trước đó
- Đối với các tập dữ liệu được ghi thường xuyên, phân trang bù trừ có thể bỏ qua các bản ghi hoặc hiển thị các bản trùng lặp nếu kết quả gần đây đã được thêm vào hoặc bị xóa khỏi trang mà người dùng hiện đang xem
Tuy nhiên, phân trang con trỏ có những hạn chế sau
- Giống như
00, chỉ có thể sử dụng phân trang con trỏ để hiển thị liên kết "Tiếp theo" và "Trước đó" và không hỗ trợ tạo liên kết có số trang$users = DB::table['users']->simplePaginate[15];
- Nó yêu cầu thứ tự dựa trên ít nhất một cột duy nhất hoặc tổ hợp các cột duy nhất. Các cột có giá trị
69 không được hỗ trợ$users = DB::table['users']->simplePaginate[15];
- Biểu thức truy vấn trong mệnh đề "order by" chỉ được hỗ trợ nếu chúng được đặt bí danh và cũng được thêm vào mệnh đề "select"
- Biểu thức truy vấn có tham số không được hỗ trợ
Tạo thủ công một Paginator
Đôi khi bạn có thể muốn tạo một phiên bản phân trang theo cách thủ công, chuyển cho nó một mảng các mục mà bạn đã có trong bộ nhớ. Bạn có thể làm như vậy bằng cách tạo phiên bản
$users = DB::table['users']->simplePaginate[15];
80, $users = DB::table['users']->simplePaginate[15];
81 hoặc $users = DB::table['users']->simplePaginate[15];
63, tùy thuộc vào nhu cầu của bạnCác lớp
$users = DB::table['users']->simplePaginate[15];
83 và $users = DB::table['users']->simplePaginate[15];
84 không cần biết tổng số phần tử trong tập kết quả; . $users = DB::table['users']->simplePaginate[15];
85 chấp nhận hầu hết các đối số giống như $users = DB::table['users']->simplePaginate[15];
83; Nói cách khác,
$users = DB::table['users']->simplePaginate[15];
83 tương ứng với phương pháp $users = DB::table['users']->simplePaginate[15];
00 trên trình tạo truy vấn, $users = DB::table['users']->simplePaginate[15];
84 tương ứng với phương pháp $users = DB::table['users']->simplePaginate[15];
05 và $users = DB::table['users']->simplePaginate[15];
85 tương ứng với phương pháp $users = DB::table['users']->simplePaginate[15];
4Cảnh báo
Khi tạo phiên bản trình phân trang theo cách thủ công, bạn nên "cắt" mảng kết quả mà bạn chuyển đến trình phân trang theo cách thủ công. Nếu bạn không chắc chắn cách thực hiện việc này, hãy xem hàm array_slice PHP.
Tùy chỉnh URL phân trang
Theo mặc định, các liên kết được tạo bởi trình phân trang sẽ khớp với URI của yêu cầu hiện tại. Tuy nhiên, phương thức
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
03 của trình phân trang cho phép bạn tùy chỉnh URI mà trình phân trang sử dụng khi tạo liên kết. Ví dụ: nếu bạn muốn trình phân trang tạo các liên kết như './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
04, bạn nên chuyển './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
05 cho phương thức './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
03namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
1Nối các giá trị chuỗi truy vấn
Bạn có thể thêm vào chuỗi truy vấn của các liên kết phân trang bằng phương pháp
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
07. Ví dụ: để thêm './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
08 vào mỗi liên kết phân trang, bạn nên thực hiện lệnh gọi sau tới './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
07namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
2Bạn có thể sử dụng phương thức
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
50 nếu bạn muốn nối tất cả các giá trị chuỗi truy vấn của yêu cầu hiện tại vào các liên kết phân trangnamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
3Nối các đoạn băm
Nếu bạn cần thêm một "đoạn mã băm" vào các URL được tạo bởi trình phân trang, bạn có thể sử dụng phương thức
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
51. Ví dụ: để thêm './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
52 vào cuối mỗi liên kết phân trang, bạn nên gọi phương thức './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
51 như vậynamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
4Hiển thị kết quả phân trang
Khi gọi phương thức
$users = DB::table['users']->simplePaginate[15];
4, bạn sẽ nhận được một thể hiện của $users = DB::table['users']->simplePaginate[15];
81, trong khi gọi phương thức $users = DB::table['users']->simplePaginate[15];
00 sẽ trả về một thể hiện của $users = DB::table['users']->simplePaginate[15];
80. Và, cuối cùng, gọi phương thức $users = DB::table['users']->simplePaginate[15];
05 trả về một thể hiện của $users = DB::table['users']->simplePaginate[15];
63Các đối tượng này cung cấp một số phương thức mô tả tập kết quả. Ngoài các phương thức trợ giúp này, các thể hiện của trình phân trang là các trình vòng lặp và có thể được lặp dưới dạng một mảng. Vì vậy, khi bạn đã truy xuất kết quả, bạn có thể hiển thị kết quả và hiển thị các liên kết trang bằng Blade
Phương pháp
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
80 sẽ hiển thị các liên kết đến phần còn lại của các trang trong tập hợp kết quả. Mỗi liên kết này sẽ chứa biến chuỗi truy vấn $users = DB::table['users']->simplePaginate[15];
6 thích hợp. Hãy nhớ rằng HTML được tạo bởi phương pháp './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
80 tương thích với khung CSS TailwindĐiều chỉnh cửa sổ liên kết phân trang
Khi trình phân trang hiển thị các liên kết phân trang, số trang hiện tại được hiển thị cũng như các liên kết cho ba trang trước và sau trang hiện tại. Sử dụng phương pháp
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
83, bạn có thể kiểm soát số lượng liên kết bổ sung được hiển thị ở mỗi bên của trang hiện tại ở giữa, cửa sổ trượt của các liên kết do trình phân trang tạo ranamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
5Chuyển đổi kết quả thành JSON
Các lớp paginator của Laravel triển khai hợp đồng Giao diện
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
84 và hiển thị phương thức './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
85, do đó rất dễ dàng chuyển đổi kết quả phân trang của bạn thành JSON. Bạn cũng có thể chuyển đổi một thể hiện của trình phân trang thành JSON bằng cách trả về nó từ một tuyến đường hoặc hành động của bộ điều khiểnnamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
6JSON từ trình phân trang sẽ bao gồm thông tin meta như
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
86, './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
87, './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
88, v.v. Các bản ghi kết quả có sẵn thông qua khóa './resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
89 trong mảng JSON. Đây là một ví dụ về JSON được tạo bằng cách trả về một phiên bản trình phân trang từ một tuyến đườngnamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
7Tùy chỉnh Chế độ xem Phân trang
Theo mặc định, các chế độ xem được hiển thị để hiển thị các liên kết phân trang tương thích với khung CSS Tailwind. Tuy nhiên, nếu không sử dụng Tailwind, thì bạn có thể tùy ý xác định chế độ xem của riêng mình để hiển thị các liên kết này. Khi gọi phương thức
'./resources/**/*.blade.php',
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
80 trên phiên bản paginator, bạn có thể chuyển tên chế độ xem làm đối số đầu tiên cho phương thứcnamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
8Tuy nhiên, cách dễ nhất để tùy chỉnh chế độ xem phân trang là xuất chúng sang thư mục
$users = DB::table['users']->simplePaginate[15];
11 của bạn bằng cách sử dụng lệnh $users = DB::table['users']->simplePaginate[15];
12namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
9Lệnh này sẽ đặt các khung nhìn trong thư mục
$users = DB::table['users']->simplePaginate[15];
13 của ứng dụng của bạn. Tệp $users = DB::table['users']->simplePaginate[15];
14 trong thư mục này tương ứng với chế độ xem phân trang mặc định. Bạn có thể chỉnh sửa tệp này để sửa đổi HTML phân trangNếu bạn muốn chỉ định một tệp khác làm chế độ xem phân trang mặc định, bạn có thể gọi các phương thức
$users = DB::table['users']->simplePaginate[15];
15 và $users = DB::table['users']->simplePaginate[15];
16 của trình phân trang trong phương thức $users = DB::table['users']->simplePaginate[15];
17 của lớp $users = DB::table['users']->simplePaginate[15];
18 của bạn$users = DB::table['users']->simplePaginate[15];
0Sử dụng Bootstrap
Laravel bao gồm các chế độ xem phân trang được xây dựng bằng Bootstrap CSS. Để sử dụng các chế độ xem này thay cho các chế độ xem Tailwind mặc định, bạn có thể gọi các phương thức
$users = DB::table['users']->simplePaginate[15];
19 hoặc namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
* Show all application users.
* @return \Illuminate\Http\Response
return view['user.index', [
'users' => DB::table['users']->paginate[15]
00 của trình phân trang trong phương thức $users = DB::table['users']->simplePaginate[15];
17 của lớp $users = DB::table['users']->simplePaginate[15];
18 của bạn