如何在Laravel 5中对合并的集合进行分页?

Kin*_*Net 20 php pagination laravel laravel-5

我正在创建一个包含两种类型对象的流,BluePerson和RedPerson.要创建流,我将获取所有两个对象,然后将它们合并到一个集合中.在这样做之后,我需要对它们进行分页,但是paginate用于雄辩的模型和数据库查询,而不是集合.我已经看到很多关于手动创建paginator的内容,但是文档,特别是在API中的文档是稀疏的(我甚至无法找到Paginator类接受的参数.)

如何对合并我的集合的结果进行分页?

public function index()
{
    $bluePerson = BluePerson::all();
    $redPerson = RedPerson::all();

    $people = $bluePerson->merge($redPerson)->sortByDesc('created_at');


    return view('stream.index')->with('people', $people);
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*and 31

如果要使用LengthAwarePaginator,只需实例化一个.如前一个答案的评论中所述,您必须为此设置路径.您还需要确保解析"currentPage"并在实例化分页器之前设置要返回的项目.这可以在实例化之前/之后完成.所以函数可能看起来像:

function paginateCollection($collection, $perPage, $pageName = 'page', $fragment = null)
{
    $currentPage = \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPage($pageName);
    $currentPageItems = $collection->slice(($currentPage - 1) * $perPage, $perPage);
    parse_str(request()->getQueryString(), $query);
    unset($query[$pageName]);
    $paginator = new \Illuminate\Pagination\LengthAwarePaginator(
        $currentPageItems,
        $collection->count(),
        $perPage,
        $currentPage,
        [
            'pageName' => $pageName,
            'path' => \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPath(),
            'query' => $query,
            'fragment' => $fragment
        ]
    );

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

  • 这解决了使用laravel 5.3的问题.我合并了2个集合,因为工会引起了问题,现在分页工作+1 (6认同)

ita*_*chi 28

然而,分页似乎是用于雄辩的模型和数据库查询,而不是集合.

你是对的.但是对于集合有一个分页器功能.forPage

句法:

Collection forPage(int $page, int $perPage)
Run Code Online (Sandbox Code Playgroud)

例:

休息很简单.

public function foo()
{
    $collection = collect([1,2,3,4,5,6,7,8,9,0]);
    $items = $collection->forPage($_GET['page'], 5); //Filter the page var
    dd($items);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要与Eloquent Collection`paginate()`方法类似的语法,为什么不试试这些解决方案呢?https://gist.github.com/simonhamp/549e8821946e2c40a617c85d2cf5af5e (4认同)

Kel*_*elt 7

您可以尝试对两个集进行分页并合并它们.您可以在docsapi中找到有关分页的更多信息.以下是手动创建自己的分页器的示例...

$perPage = 20;
$blue = BluePerson::paginate($perPage / 2);
$red = RedPerson::paginate($perPage - count($blue));
$people = PaginationMerger::merge($blue, $red);
Run Code Online (Sandbox Code Playgroud)

我在下面包含了PaginationMerger类.

use Illuminate\Pagination\LengthAwarePaginator;

class PaginationMerger
{
    /**
     * Merges two pagination instances
     *
     * @param  Illuminate\Pagination\LengthAwarePaginator $collection1
     * @param  Illuminate\Pagination\LengthAwarePaginator $collection2
     * @return Illuminate\Pagination\LengthAwarePaginator
     */
    static public function merge(LengthAwarePaginator $collection1, LengthAwarePaginator $collection2)
    {
        $total = $collection1->total() + $collection2->total();

        $perPage = $collection1->perPage() + $collection2->perPage();

        $items = array_merge($collection1->items(), $collection2->items());

        $paginator = new LengthAwarePaginator($items, $total, $perPage);

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


Roh*_*ami 7

分页集合的最佳方式:

1- 将此添加到 \app\Providers\AppServiceProvider 中的启动功能

       /*
         * use Illuminate\Support\Collection;
         * use Illuminate\Pagination\LengthAwarePaginator;
         *
         * Paginate a standard Laravel Collection.
         *
         * @param int $perPage
         * @param int $total
         * @param int $page
         * @param string $pageName
         * @return array
         */
        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,
                ]
            );
        });
Run Code Online (Sandbox Code Playgroud)

2-从此以后,您可以像代码一样对所有集合进行分页

$people->paginate(5)
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以在Providers / AppServiceProvider中为Collection添加以下代码。

    // Enable pagination
    if (!Collection::hasMacro('paginate')) {

        Collection::macro('paginate', 
            function ($perPage = 15, $page = null, $options = []) {
            $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
            return (new LengthAwarePaginator(
                $this->forPage($page, $perPage)->values()->all(), $this->count(), $perPage, $page, $options))
                ->withPath('');
        });
    }
Run Code Online (Sandbox Code Playgroud)

然后,您可以像Eloquent模型一样从集合中调用分页。例如

$pages = collect([1, 2, 3, 4, 5, 6, 7, 8, 9])->paginate(5);
Run Code Online (Sandbox Code Playgroud)

  • 这段代码太棒了。这样,您只需在 AppServiceProvider boot() 函数中添加下面提到的路径即可。使用 Illuminate\Support\Collection;使用 Illuminate\Pagination\Paginator;使用 Illuminate\Pagination\LengthAwarePaginator; (2认同)