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)
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)
您可以尝试对两个集进行分页并合并它们.您可以在docs和api中找到有关分页的更多信息.以下是手动创建自己的分页器的示例...
$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)
分页集合的最佳方式:
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)