نسخه:

پایگاه داده: صفحه بندی

معرفی

در چارچوب های دیگر، صفحه بندی می تواند بسیار دردناک باشد. صفحه‌بندی لاراول با سازنده پرس و جو و 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 دستور استفاده می‌کنند، توسط لاراول قابل اجرا نیستند. اگر نیاز به استفاده از a groupBy با مجموعه نتایج صفحه‌بندی شده دارید، توصیه می‌شود که پایگاه داده را پرس و جو کنید و یک صفحه‌نمای دستی ایجاد کنید.

"صفحه بندی ساده"

اگر فقط نیاز دارید پیوندهای ساده «بعدی» و «قبلی» را در نمای صفحه‌بندی خود نمایش دهید، می‌توانید از این 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) متغیر رشته کوئری مورد استفاده برای ذخیره صفحه را تنظیم کنید.