如何对 Laravel 集合进行分页?

Jet*_*etz 5 model-view-controller pagination laravel laravel-collection laravel-query-builder

这是我尝试分页的方式:

$posts = Post::all()->sortByDesc("created_at")->pagination(1);
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

方法 Illuminate\Database\Eloquent\Collection::pagination 不存在。

小智 26

创建辅助类

<?php

namespace App\Helpers;

use Illuminate\Container\Container;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Collection;

class PaginationHelper
{
    public static function paginate(Collection $results, $showPerPage)
    {
        $pageNumber = Paginator::resolveCurrentPage('page');

        $totalPageNumber = $results->count();

        return self::paginator($results->forPage($pageNumber, $showPerPage), $totalPageNumber, $showPerPage, $pageNumber, [
            'path' => Paginator::resolveCurrentPath(),
            'pageName' => 'page',
        ]);

    }

    /**
     * Create a new length-aware paginator instance.
     *
     * @param  \Illuminate\Support\Collection  $items
     * @param  int  $total
     * @param  int  $perPage
     * @param  int  $currentPage
     * @param  array  $options
     * @return \Illuminate\Pagination\LengthAwarePaginator
     */
    protected static function paginator($items, $total, $perPage, $currentPage, $options)
    {
        return Container::getInstance()->makeWith(LengthAwarePaginator::class, compact(
            'items', 'total', 'perPage', 'currentPage', 'options'
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

打开composer.json文件。之后要添加一个帮助文件。Composer 有一个 files 键(它是一个文件路径数组),您可以在自动加载内部定义它:

"autoload": {
    "files": [
        "app/Helpers/PaginationHelper.php"
    ],
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},
Run Code Online (Sandbox Code Playgroud)

现在您必须在终端中输入以下命令:

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

现在您可以创建集合分页,如下例所示:

Route::get('/test_collect_pagintae', function () {

    $users = \App\User::get();

    $showPerPage = 20;

    $paginated = PaginationHelper::paginate($users, $showPerPage);

    return $paginated;
});
Run Code Online (Sandbox Code Playgroud)


小智 6

这是因为它paginate是一个Builder方法,而不是一个集合。

您需要手动创建分页器。手动创建分页器中描述了如何操作。


小智 6

您可以在方法 boot 中使用此代码app/provider/serviceProvider

Collection::macro('paginate', function($perPage, $page = null, $pageName = 'page') {
            $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
            return new LengthAwarePaginator(
                $this->forPage($page, $perPage), // $items
                $this->count(),                  // $total
                $perPage,
                $page,
                [                                // $options
                    'path' => LengthAwarePaginator::resolveCurrentPath(),
                    'pageName' => $pageName,
                ]
            );
        });
Run Code Online (Sandbox Code Playgroud)