我们可以通过laravel的Api文档看到paginate的Api参数如下
paginate(int $perPage = null, array $columns = array('*'), string $pageName = 'page', int|null $page = null)
如果你想动态传输当前page,可以通过第四个参数来实现
例如想要第10页数据
$perPage = 15;
$columns = ['*'];
$pageName = 'page';
$currentPage = 10;
paginate($perPage, $columns, $pageName, $currentPage);
至于为什么默认情况下,当前页通过HTTP请求查询字符串参数?page的值判断。下面的可以做一下参考
执行Eloquent的paginate方法时
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
$page = $page ?: Paginator::resolveCurrentPage($pageName);
$perPage = $perPage ?: $this->model->getPerPage();
$query = $this->toBase();
$total = $query->getCountForPagination();
$results = $total
? $this->forPage($page, $perPage)->get($columns)
: $this->model->newCollection();
return new LengthAwarePaginator($results, $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]);
}
留意到$page = $page ?: Paginator::resolveCurrentPage($pageName);
其中resolveCurrentPage
方法时继承于Illuminate/Pagination/AbstractPaginator.php
/**
* Resolve the current page or return the default value.
*
* @param string $pageName
* @param int $default
* @return int
*/
public static function resolveCurrentPage($pageName = 'page', $default = 1)
{
if (isset(static::$currentPageResolver)) {
return call_user_func(static::$currentPageResolver, $pageName);
}
return $default;
}
/**
* Set the current page resolver callback.
*
* @param \Closure $resolver
* @return void
*/
public static function currentPageResolver(Closure $resolver)
{
static::$currentPageResolver = $resolver;
}
看到这里你会发现当前页码取决于static::$currentPageResolver
如果不存在就返回默认1
然而这个抽象类以及子类中并没有定义static::$currentPageResolver
,那laravel为什么默认情况下,当前页能通过HTTP请求查询字符串参数?page
的值判断呢?别急,看laravel的代码看ServiceProvider
很重要。
我们可以发现在Illuminate/Pagination/PaginationServiceProvider.php中
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
Paginator::viewFactoryResolver(function () {
return $this->app['view'];
});
Paginator::currentPathResolver(function () {
return $this->app['request']->url();
});
Paginator::currentPageResolver(function ($pageName = 'page') {
$page = $this->app['request']->input($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
}
对的你没看错在PaginationServiceProvider
分页这个服务提供者中注册了这个方法的闭包
Paginator::currentPageResolver(function ($pageName = 'page') {
$page = $this->app['request']->input($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
通过request
服务取到路径中的$pageName
也就是默认的page
,然后判断一下是否是int型且大于等于1,是就返回$page
值,否则就是默认的1
没错laravel就是这么神奇
That's all
Enjoy
我们可以通过laravel的Api文档看到paginate的Api参数如下
paginate(int $perPage = null, array $columns = array('*'), string $pageName = 'page', int|null $page = null)
如果你想动态传输当前page,可以通过第四个参数来实现
例如想要第10页数据
$perPage = 15;
$columns = ['*'];
$pageName = 'page';
$currentPage = 10;
paginate($perPage, $columns, $pageName, $currentPage);
至于为什么默认情况下,当前页通过HTTP请求查询字符串参数?page的值判断。下面的可以做一下参考
执行Eloquent的paginate方法时
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
$page = $page ?: Paginator::resolveCurrentPage($pageName);
$perPage = $perPage ?: $this->model->getPerPage();
$query = $this->toBase();
$total = $query->getCountForPagination();
$results = $total
? $this->forPage($page, $perPage)->get($columns)
: $this->model->newCollection();
return new LengthAwarePaginator($results, $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]);
}
留意到$page = $page ?: Paginator::resolveCurrentPage($pageName);
其中resolveCurrentPage
方法时继承于Illuminate/Pagination/AbstractPaginator.php
/**
* Resolve the current page or return the default value.
*
* @param string $pageName
* @param int $default
* @return int
*/
public static function resolveCurrentPage($pageName = 'page', $default = 1)
{
if (isset(static::$currentPageResolver)) {
return call_user_func(static::$currentPageResolver, $pageName);
}
return $default;
}
/**
* Set the current page resolver callback.
*
* @param \Closure $resolver
* @return void
*/
public static function currentPageResolver(Closure $resolver)
{
static::$currentPageResolver = $resolver;
}
看到这里你会发现当前页码取决于static::$currentPageResolver
如果不存在就返回默认1
然而这个抽象类以及子类中并没有定义static::$currentPageResolver
,那laravel为什么默认情况下,当前页能通过HTTP请求查询字符串参数?page
的值判断呢?别急,看laravel的代码看ServiceProvider
很重要。
我们可以发现在Illuminate/Pagination/PaginationServiceProvider.php中
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
Paginator::viewFactoryResolver(function () {
return $this->app['view'];
});
Paginator::currentPathResolver(function () {
return $this->app['request']->url();
});
Paginator::currentPageResolver(function ($pageName = 'page') {
$page = $this->app['request']->input($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
}
对的你没看错在PaginationServiceProvider
分页这个服务提供者中注册了这个方法的闭包
Paginator::currentPageResolver(function ($pageName = 'page') {
$page = $this->app['request']->input($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
通过request
服务取到路径中的$pageName
也就是默认的page
,然后判断一下是否是int型且大于等于1,是就返回$page
值,否则就是默认的1
没错laravel就是这么神奇
That's all
Enjoy
@milkmeowo 我像你这样说的传了这个参数进去,会报这样的错误的
Type error: Argument 1 passed to Illuminate\Database\Grammar::columnize() must be of the type array, float given, called in /var/www/enclaveapp/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php on line 121
下面是我的分页代码$comments = Comment::where(['source_id' => $request->source_id, 'type' => $request->type])->orderBy('id', 'desc')->paginate($count,$currentPage);
@milkmeowo 我像你这样说的传了这个参数进去,会报这样的错误的
Type error: Argument 1 passed to Illuminate\Database\Grammar::columnize() must be of the type array, float given,
called in /var/www/enclaveapp/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php on line 121
下面是我的分页代码
$comments = Comment::where(['source_id' => $request->source_id, 'type' => $request->type])->orderBy('id', 'desc')->paginate($count,$currentPage);
@ChenPHPER 来我们学一下数学
顺序 | 参数 | 你的顺序 | 你的参数 |
---|---|---|---|
1 | $perPage = 15; |
1 | $count |
2 | $columns = ['*']; |
4 | $currentPage |
3 | $pageName = 'page'; |
(黑人问号) | |
4 | $currentPage = 10; |
(黑人问号) |
paginate($perPage, $columns, $pageName, $currentPage);
所以你应该
$comments = Comment::where([
'source_id' => $request->source_id,
'type' => $request->type,
])
->orderBy('id', 'desc')
->paginate($count, [*], 'page', $currentPage);
@xhh110 看,怎么说来着,写出来之后别人还是理解不能,所以
详细并不一定代表好,只有通俗易懂才是真的好
```
$limit = $request->limit ? $request->limit : 8;
$page = $request->page ? $request->page - 1 : 0;
if(!is_numeric($page)){
return response()->json(['error'=>['message' => '参数错误!']]);
}
$page = $page < 0 ? 0 : $page ;
$page = $page * $limit;
$model->offset($page)->limit($limit);
推荐文章: