-
-
Save vluzrmos/3ce756322702331fdf2bf414fea27bcb to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* Gera a paginação dos itens de um array ou collection. | |
* | |
* @param array|Collection $items | |
* @param int $perPage | |
* @param int $page | |
* @param array $options | |
* | |
* @return LengthAwarePaginator | |
*/ | |
public function paginate($items, $perPage = 15, $page = null, $options = []) | |
{ | |
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1); | |
$items = $items instanceof Collection ? $items : Collection::make($items); | |
return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options); | |
} |
Hello to everyone, how can i use ->links()? Thanks in advance
If you have a problem with pagination add values() method:
return new LengthAwarePaginator($items->forPage($page, $perPage)->values(), $count, $perPage, $page, []);
I have a problems when fetch page > 1, $items->forPage($page, $perPage)->values()
. this solved my problems.
This type of pagination can impact performance?
Thanks very much
Laravel 9.x and above
public static function paginate(array|Collection $items, mixed $perPage = null, mixed $page = null, array $options = [], mixed $path = null)
{
$perPage = is_null($perPage) ? 25 : $perPage;
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
$items = $items instanceof Collection ? $items : Collection::make($items);
$paginator = new LengthAwarePaginator(
$items->forPage($page, $perPage),
$items->count(),
$perPage,
$page,
$options
);
if(!is_null($path)) {
$paginator->setPath($path);
}
return $paginator;
}
Basic Example:
// set path dynamically from current route name or url with params
$path = route(request()->route()->getName(), $request->except(['page']));
$invoices = YOUR_HELPER_CLASS_HERE::paginate(
items: $data,
perPage: 10,
path: $path
);
Laravel 10.x / PHP 8.2 and above:
public static function paginate(
array|Collection $items,
?int $perPage = null,
?int $page = null,
array $options = [],
?string $path = null
): LengthAwarePaginator {
$perPage ??= 50;
$page ??= Paginator::resolveCurrentPage(default: 1);
$path ??= Paginator::resolveCurrentPath();
$items = $items instanceof Collection ? $items : Collection::make($items);
$paginator = new LengthAwarePaginator(
$items->forPage($page, $perPage),
$items->count(),
$perPage,
$page,
$options
);
if (!blank($path)) {
$paginator = $paginator->setPath($path);
}
return $paginator;
}
Usage:
$paginated_list = Helper_Class::paginate($list_of_items);
Collection::macro('paginate', function($perPage = 15, $page = null, $options = []) {
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
if (!isset($options['path'])) {
$options['path'] = '/' . request()->path();
}
return new LengthAwarePaginator(array_values($this->forPage($page, $perPage)->toArray()), $this->count(), $perPage, $page, $options);
});
Failed in L10
Place this in the boot method of your App\Providers\AppServiceProvider;
Collection::macro('paginate', function ($perPage = 15, $page = null, $options = []) {
$page = $page ?: (\Illuminate\Pagination\Paginator::resolveCurrentPage() ?: 1);
return new \Illuminate\Pagination\LengthAwarePaginator(array_values($this->forPage($page, $perPage)->toArray()), $this->count(), $perPage, $page, $options);
});
Use like this
$perPage = 5;
collect([1,2,3,4,5])->paginate($perPage)
Great, thanks! 👍
Great!! It works just fine. Thanks a lot!!!