集合分頁

haibin_hu發表於2019-06-11

建立服務提供者

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
//引入這幾個類
use Illuminate\Pagination\Paginator;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;

class CollectionMacroServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
        if (!Collection::hasMacro('paginate')) {
            //註冊巨集
            Collection::macro('paginate', 
                function ($perPage = 15, $page = null, $options = []) {
                    //獲取當前頁
                    $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);                    
                    //初始化LengthAwarePaginator
                    return (new LengthAwarePaginator(
                        $this->forPage($page, $perPage), $this->count(), $perPage, $page, $options))
                    ->withPath(''); 
                });
        }
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

在config/app.php的providers陣列中加入一行:

App\Providers\CollectionMacroServiceProvider::class,

使用:

collect([1,2,3,4,5,6])->paginate(5);

使用時如果提示 withPath 這個方法未定義,把這個方法刪除掉就可以了

集合分頁會遇到資料應該是陣列,但是返回的是物件,這樣來處理,因為集合排序後ID不是從0開始的
以下參考此文章:部落格:Laravel 的限制條數再分頁

$data = collect($sumData)->sortByDesc('i');
//傳入頁數,預設值為1
$page = $request->page ?? 1;
//每頁的條數
$perPage = $request->input('page_size', 10);
//計算每頁分頁的初始位置
$offset = ($page * $perPage) - $perPage;
//例項化LengthAwarePaginator類,並傳入對應的引數
$data = new LengthAwarePaginator(
    array_values($data->slice($offset, $perPage)->toArray()),  // 物件轉陣列參考:https://learnku.com/articles/15044
    count($data),
    $perPage,
    $page,
    ['path' => $request->url(), 'query' => $request->query()]
);
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章