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

2022-08-30 11:37:43

我正在创建一个包含两种类型的对象的流,BluePerson和RedPerson。为了创建流,我获取了这两个对象的所有对象,然后将它们合并到一个集合中。这样做之后,我需要对它们进行分页,但是分页是用于雄辩的模型和数据库查询,而不是集合。我已经看过很多关于手动创建分页器的内容,但是文档,尤其是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);
}

答案 1

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

你是对的。但是有一个用于集合的分页器函数。forPage

语法:

Collection forPage(int $page, int $perPage)

例:

休息很简单。

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);
}

答案 2

如果你想使用 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;
}

推荐