پایگاه داده: صفحه بندی
معرفی
در چارچوب های دیگر، صفحه بندی می تواند بسیار دردناک باشد. صفحهبندی لاراول با سازنده پرس و جو و Eloquent ORM یکپارچه شده است و صفحهبندی راحت و آسان نتایج پایگاه داده را خارج از جعبه فراهم میکند. HTML تولید شده توسط صفحهبندی کننده با فریم ورک Bootstrap CSS سازگار است .
استفاده پایه
صفحه بندی نتایج سازنده پرس و جو
روش های مختلفی برای صفحه بندی آیتم ها وجود دارد.
ساده ترین روش استفاده از
paginate
متد در
سازنده پرس و جو
یا
پرس و جوی Eloquent
است .
این
paginate
روش به طور خودکار از تنظیم حد مناسب و افست بر اساس صفحه فعلی که توسط
کاربر مشاهده می شود مراقبت می کند.
به طور پیش فرض، صفحه فعلی با مقدار آرگومان
page
رشته پرس و جو در درخواست HTTP شناسایی می شود.
این مقدار بهطور خودکار توسط لاراول شناسایی میشود و همچنین بهطور خودکار
در لینکهای تولید شده توسط صفحهنماگر درج میشود.
در این مثال، تنها آرگومان ارسال شده به
paginate
متد، تعداد مواردی است که میخواهید در هر صفحه نمایش داده شوند.
در این مورد، اجازه دهید مشخص کنیم که می خواهیم
15
موارد را در هر صفحه نمایش دهیم:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;use Illuminate\Support\Facades\DB; class UserController extends Controller{ /** * Show all of the users for the application. * * @return Response */ public function index() { $users = DB::table('users')->paginate(15); return view('user.index', ['users' => $users]); }}
در حال حاضر، عملیات صفحهبندی که از یک
groupBy
دستور استفاده میکنند، توسط لاراول قابل اجرا نیستند. اگر نیاز به استفاده از agroupBy
با مجموعه نتایج صفحهبندی شده دارید، توصیه میشود که پایگاه داده را پرس و جو کنید و یک صفحهنمای دستی ایجاد کنید.
"صفحه بندی ساده"
اگر فقط نیاز دارید پیوندهای ساده «بعدی» و «قبلی» را در نمای صفحهبندی خود
نمایش دهید، میتوانید از این
simplePaginate
روش برای انجام پرس و جوی کارآمدتر استفاده کنید.
این برای مجموعه داده های بزرگ بسیار مفید است، زمانی که نیازی به نمایش
پیوند برای هر شماره صفحه در هنگام نمایش نمای خود ندارید:
$users = DB::table('users')->simplePaginate(15);
صفحه بندی نتایج شیوا
همچنین می توانید پرس و جوهای
Eloquent
را صفحه بندی کنید .
User
در این مثال، مدل را با
15
موارد در هر صفحه
صفحه بندی می کنیم .
همانطور که می بینید، نحو تقریباً با صفحه بندی نتایج سازنده پرس و جو یکسان
است:
$users = App\User::paginate(15);
میتوانید
paginate
پس از تنظیم سایر محدودیتها در پرس و جو تماس بگیرید، مانند
where
بندها:
$users = User::where('votes', '>', 100)->paginate(15);
همچنین میتوانید
simplePaginate
هنگام صفحهبندی مدلهای Eloquent از این روش استفاده کنید:
$users = User::where('votes', '>', 100)->simplePaginate(15);
ایجاد صفحهنگار دستی
گاهی اوقات ممکن است بخواهید یک نمونه صفحه بندی را به صورت دستی ایجاد کنید
و مجموعه ای از موارد را به آن ارسال کنید.
بسته به نیازتان،
میتوانید این کار را با ایجاد یک
Illuminate\Pagination\Paginator
یا نمونه انجام دهید.
Illuminate\Pagination\LengthAwarePaginator
کلاس
Paginator
نیازی به دانستن تعداد کل موارد در مجموعه نتایج ندارد.
با این حال، به این دلیل، کلاس روشی برای بازیابی فهرست صفحه آخر ندارد.
LengthAwarePaginator
تقریبا همان آرگومانهایی را میپذیرد
که
Paginator
;
با این حال، نیاز به شمارش تعداد کل موارد در مجموعه نتیجه دارد.
به عبارت دیگر،
Paginator
مربوط به
simplePaginate
متد در query builder و Eloquent است، در حالی که
LengthAwarePaginator
مربوط به
paginate
متد است.
هنگامی که به صورت دستی یک نمونه صفحهکننده ایجاد میکنید، باید آرایهای از نتایج را که به صفحهبندیکننده ارسال میکنید، بهصورت دستی «برش» کنید. اگر مطمئن نیستید که چگونه این کار را انجام دهید، تابع array_slice PHP را بررسی کنید.
نمایش نتایج صفحه بندی
هنگام فراخوانی
paginate
متد، نمونه ای از
Illuminate\Pagination\LengthAwarePaginator
.
هنگام فراخوانی
simplePaginate
متد، نمونه ای از
Illuminate\Pagination\Paginator
.
این اشیاء چندین روش ارائه می دهند که مجموعه نتایج را توصیف می کنند.
علاوه بر این روشهای کمکی، نمونههای صفحهبندی کننده تکرارکننده هستند و
ممکن است به عنوان یک آرایه حلقه شوند.
بنابراین، هنگامی که نتایج را بازیابی کردید، می توانید نتایج را نمایش دهید
و پیوندهای صفحه را با استفاده از
Blade
ارائه دهید :
<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach</div> {{ $users->links() }}
این
links
روش پیوندها را به بقیه صفحات در مجموعه نتیجه نمایش می دهد.
هر یک از این پیوندها قبلاً حاوی متغیر رشته پرس و جو مناسب هستند
page
.
به یاد داشته باشید، HTML تولید شده توسط این
links
روش با
چارچوب Bootstrap CSS
سازگار است .
سفارشی کردن URI صفحهنماگر
این
withPath
روش به شما امکان میدهد تا URI مورد استفاده توسط صفحهنگار را هنگام ایجاد
پیوندها سفارشی کنید.
به عنوان مثال، اگر می خواهید صفحه بندی کننده پیوندهایی مانند ایجاد کند
http://example.com/custom/url?page=N
، باید
custom/url
به
withPath
روش زیر بروید:
Route::get('users', function () { $users = App\User::paginate(15); $users->withPath('custom/url'); //});
الحاق به پیوندهای صفحه بندی
می توانید با استفاده از روش به رشته پرس و جو پیوندهای صفحه بندی اضافه
کنید
appends
.
به عنوان مثال، برای الحاق
sort=votes
به هر پیوند صفحه بندی، باید با شماره زیر تماس بگیرید
appends
:
{{ $users->appends(['sort' => 'votes'])->links() }}
اگر می خواهید تمام مقادیر رشته پرس و جو فعلی را به پیوندهای صفحه بندی
اضافه کنید، می توانید از
withQueryString
روش زیر استفاده کنید:
{{ $users->withQueryString()->links() }}
اگر میخواهید یک «پاره هش» به URL صفحهبندی کننده اضافه کنید، میتوانید
از این
fragment
روش استفاده کنید.
برای مثال، برای الحاق
#foo
به انتهای هر پیوند صفحه بندی، روش زیر را فراخوانی کنید
fragment
:
{{ $users->fragment('foo')->links() }}
تنظیم پنجره پیوند صفحه بندی
شما می توانید کنترل کنید که چه تعداد پیوند اضافی در هر طرف "پنجره" URL
صفحه صفحه نمایش داده می شود.
به طور پیش فرض، سه پیوند در هر طرف پیوندهای صفحهبندی اولیه نمایش داده
میشوند.
با این حال، می توانید این عدد را با استفاده از
onEachSide
روش زیر کنترل کنید:
{{ $users->onEachSide(5)->links() }}
تبدیل نتایج به JSON
کلاسهای نتیجه صفحهنمای لاراول
Illuminate\Contracts\Support\Jsonable
قرارداد Interface را پیادهسازی میکنند و
toJson
روش را آشکار میکنند، بنابراین تبدیل نتایج صفحهبندی به JSON بسیار آسان
است.
همچنین میتوانید یک نمونه صفحهنما را با بازگرداندن آن از یک مسیر یا
عملکرد کنترلکننده به JSON تبدیل کنید:
Route::get('users', function () { return App\User::paginate();});
JSON از صفحهبندی کننده شامل اطلاعات متا مانند
total
،،،
و غیره
current_page
خواهد بود.
last_page
اشیاء نتیجه واقعی از طریق
data
کلید در آرایه JSON در دسترس خواهند بود.
در اینجا نمونه ای از JSON ایجاد شده با برگرداندن یک نمونه صفحه بندی از یک
مسیر است:
{ "total": 50, "per_page": 15, "current_page": 1, "last_page": 4, "first_page_url": "http://laravel.app?page=1", "last_page_url": "http://laravel.app?page=4", "next_page_url": "http://laravel.app?page=2", "prev_page_url": null, "path": "http://laravel.app", "from": 1, "to": 15, "data":[ { // Result Object }, { // Result Object } ]}
سفارشی کردن نمای صفحه بندی
بهطور پیشفرض، نماهایی که برای نمایش پیوندهای صفحهبندی ارائه میشوند،
با چارچوب Bootstrap CSS سازگار هستند.
با این حال، اگر از Bootstrap استفاده نمیکنید، میتوانید دیدگاههای خود
را برای ارائه این پیوندها تعریف کنید.
هنگام فراخوانی
links
متد در یک نمونه صفحهبندی، نام view را به عنوان اولین آرگومان به متد
ارسال کنید:
{{ $paginator->links('view.name') }} // Passing data to the view...{{ $paginator->links('view.name', ['foo' => 'bar']) }}
با این حال، ساده ترین راه برای سفارشی کردن نماهای صفحه بندی، صادر کردن
آنها به
resources/views/vendor
دایرکتوری با استفاده از
vendor:publish
دستور زیر است:
php artisan vendor:publish --tag=laravel-pagination
این دستور view ها را در
resources/views/vendor/pagination
دایرکتوری قرار می دهد.
فایل
bootstrap-4.blade.php
درون این فهرست با نمای صفحهبندی پیشفرض مطابقت دارد.
شما می توانید این فایل را برای تغییر HTML صفحه بندی ویرایش کنید.
اگر میخواهید فایل دیگری را بهعنوان نمای صفحهبندی پیشفرض تعیین کنید،
میتوانید از صفحهبندی
defaultView
و
defaultSimpleView
روشهای موجود در خود استفاده کنید
AppServiceProvider
:
use Illuminate\Pagination\Paginator; public function boot(){ Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name');}
با استفاده از Tailwind
لاراول شامل نماهای صفحه بندی است که با استفاده از
Tailwind CSS
ساخته شده است .
برای استفاده از این نماها به جای نماهای پیشفرض بوت استرپ، میتوانید
useTailwind
متد صفحهبندی را در داخل خود فراخوانی کنید
AppServiceProvider
:
use Illuminate\Pagination\Paginator; public function boot(){ Paginator::useTailwind();}
روش های نمونه صفحه بندی
هر نمونه صفحهبندی اطلاعات اضافی صفحهبندی را از طریق روشهای زیر ارائه میکند:
روش | شرح |
---|---|
$paginator->count() |
تعداد موارد صفحه فعلی را دریافت کنید. |
$paginator->currentPage() |
شماره صفحه فعلی را دریافت کنید. |
$paginator->firstItem() |
شماره نتیجه اولین مورد را در نتایج بدست آورید. |
$paginator->getOptions() |
گزینه های صفحه بندی را دریافت کنید. |
$paginator->getUrlRange($start, $end) |
محدوده ای از URL های صفحه بندی ایجاد کنید. |
$paginator->hasPages() |
تعیین کنید که آیا موارد کافی برای تقسیم به چند صفحه وجود دارد یا خیر. |
$paginator->hasMorePages() |
تعیین کنید که آیا موارد بیشتری در فروشگاه داده وجود دارد یا خیر. |
$paginator->items() |
موارد مربوط به صفحه فعلی را دریافت کنید. |
$paginator->lastItem() |
شماره نتیجه آخرین مورد را در نتایج بدست آورید. |
$paginator->lastPage() |
شماره صفحه آخرین صفحه موجود را دریافت کنید.
(هنگام استفاده در دسترس نیست
simplePaginate
).
|
$paginator->nextPageUrl() |
آدرس صفحه بعدی را دریافت کنید. |
$paginator->onFirstPage() |
تعیین کنید که صفحهبندی در صفحه اول است یا خیر. |
$paginator->perPage() |
تعداد مواردی که باید در هر صفحه نشان داده شود. |
$paginator->previousPageUrl() |
آدرس صفحه قبل را دریافت کنید. |
$paginator->total() |
تعداد کل موارد منطبق را در ذخیرهگاه داده تعیین کنید.
(هنگام استفاده در دسترس نیست
simplePaginate
).
|
$paginator->url($page) |
نشانی اینترنتی شماره صفحه معین را دریافت کنید. |
$paginator->getPageName() |
متغیر رشته کوئری مورد استفاده برای ذخیره صفحه را دریافت کنید. |
$paginator->setPageName($name) |
متغیر رشته کوئری مورد استفاده برای ذخیره صفحه را تنظیم کنید. |