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
您可以在方法 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)