ایجاد pagination در merge لاراول
س
صفحه بندی یا Pagination در هر سایتی امری بسیار ضروری است؛ اگر دو یا چند تا کوئری رو با هم Merge کردید و نمیتونید pagination رو براشون اعمال کنید؛ در این مقاله به سادگی اینکار را انجام خواهید داد. در ادامه همراه بپرسم باشید.
فرقی نیمکند از چه نسخه لاراولی استفاده میکنید، من از این روش از لاراول نسخه ۵ تا ۹ نتیجه گرفتم.
ما تابع ‘paginate’ را با استفاده از متد macro در collection ایجاد می کنیم. شما باید آن روش را در AppServiceProvider ثبت کنید. من مثال بسیار ساده ای را برای شما بیان می کنم تا بفهمید که چگونه برای مجموعه یا آرایه صفحه لاراول کار می کند.
به صورت عادی نمیتونیم از paginate در collection یا merge استفاده کنیم، به همین منظور باید یک ماکرو در AppServiceProvider ثبت کنیم، من با یک مثال ساده اینکار را انجام میدهم.
من در اینجا از دو مدل post و blog نتایج رو خوندم و با هم merge کردم که با هم نمایش بده، کد من به این صورت هست:
۱ ۲ ۳ ۴ ۵ |
$post = Story::all(); $blog = Post::all(); $merged = $post->merge($blog); $results = $merged->paginate(۱۲); |
به صورت عادی بخوایم paginate رو اجرا کنیم،؛ قطعا خطا دریافت میکنیم؛ برا همین نیاز است تا در AppServiceProvider بیایم و کد یه macro ثبت کنیم، برای این کار به مسیر app/Providers/AppServiceProvider.php رفته و کد زیر را در بخش register بنویسید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ |
public function register() { Collection::macro('paginate', function($perPage, $total = null, $page = null, $pageName = 'page') { $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName); return new LengthAwarePaginator( $this->forPage($page, $perPage), $total ?: $this->count(), $perPage, $page, [ 'path' => LengthAwarePaginator::resolveCurrentPath(), 'pageName' => $pageName, ] ); }); } |
که کل کد AppServiceProvider ما به این صورت میشود:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ |
<?php namespace App\Providers; use Illuminate\Support\Collection; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { Collection::macro('paginate', function($perPage, $total = null, $page = null, $pageName = 'page') { $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName); return new LengthAwarePaginator( $this->forPage($page, $perPage), $total ?: $this->count(), $perPage, $page, [ 'path' => LengthAwarePaginator::resolveCurrentPath(), 'pageName' => $pageName, ] ); }); } /** * Bootstrap any application services. * * @return void */ public function boot() { // } } |
حالا کدتون رو اجرا کنید و نتیجه رو بررسی کنید 🙂
چنانچه مشکلی در paginate کردن داشتید، از ما بپرسید 🙂
موفق باشید.
ارسال نظر
شما باید وارد شوید یا عضو شوید تا بتوانید نظر ارسال کنید