diff --git a/src/Illuminate/Database/Eloquent/Builder.php b/src/Illuminate/Database/Eloquent/Builder.php index 7d69849ac64d..5f652ea62f10 100755 --- a/src/Illuminate/Database/Eloquent/Builder.php +++ b/src/Illuminate/Database/Eloquent/Builder.php @@ -1114,16 +1114,17 @@ public function pluck($column, $key = null) * @param array|string $columns * @param string $pageName * @param int|null $page - * @param \Closure|int|null $total + * @param int|null|\Closure $total + * @param array|string $countColumns * @return \Illuminate\Pagination\LengthAwarePaginator * * @throws \InvalidArgumentException */ - public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null, $total = null) + public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null, $total = null, $countColumns = ['*']) { $page = $page ?: Paginator::resolveCurrentPage($pageName); - $total = value($total) ?? $this->toBase()->getCountForPagination(); + $total = value($total) ?? $this->toBase()->getCountForPagination($countColumns); $perPage = value($perPage, $total) ?: $this->model->getPerPage(); diff --git a/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php b/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php index 88cf8b89c38f..8c5185a4e5fc 100755 --- a/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php +++ b/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php @@ -989,13 +989,15 @@ protected function aliasedPivotColumns() * @param array $columns * @param string $pageName * @param int|null $page + * @param int|null|\Closure $total + * @param array $countColumns * @return \Illuminate\Pagination\LengthAwarePaginator */ - public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) + public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null, $total = null, $countColumns = ['*']) { $this->query->addSelect($this->shouldSelect($columns)); - return tap($this->query->paginate($perPage, $columns, $pageName, $page), function ($paginator) { + return tap($this->query->paginate($perPage, $columns, $pageName, $page, $total, $countColumns), function ($paginator) { $this->hydratePivotRelation($paginator->items()); }); } diff --git a/src/Illuminate/Database/Eloquent/Relations/HasOneOrManyThrough.php b/src/Illuminate/Database/Eloquent/Relations/HasOneOrManyThrough.php index 4961e4c3c89b..b753453566cf 100644 --- a/src/Illuminate/Database/Eloquent/Relations/HasOneOrManyThrough.php +++ b/src/Illuminate/Database/Eloquent/Relations/HasOneOrManyThrough.php @@ -478,13 +478,15 @@ public function get($columns = ['*']) * @param array $columns * @param string $pageName * @param int|null $page + * @param int|null|\Closure $total + * @param array $countColumns * @return \Illuminate\Pagination\LengthAwarePaginator */ - public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) + public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null, $total = null, $countColumns = ['*']) { $this->query->addSelect($this->shouldSelect($columns)); - return $this->query->paginate($perPage, $columns, $pageName, $page); + return $this->query->paginate($perPage, $columns, $pageName, $page, $total, $countColumns); } /** diff --git a/src/Illuminate/Database/Query/Builder.php b/src/Illuminate/Database/Query/Builder.php index 9fcf09fd4328..9dc75ecba3ff 100755 --- a/src/Illuminate/Database/Query/Builder.php +++ b/src/Illuminate/Database/Query/Builder.php @@ -3602,14 +3602,15 @@ protected function withoutGroupLimitKeys($items) * @param string|\Illuminate\Contracts\Database\Query\Expression|array $columns * @param string $pageName * @param int|null $page - * @param \Closure|int|null $total + * @param int|null|\Closure $total + * @param string|\Illuminate\Contracts\Database\Query\Expression|array $countColumns * @return \Illuminate\Pagination\LengthAwarePaginator */ - public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null, $total = null) + public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null, $total = null, $countColumns = ['*']) { $page = $page ?: Paginator::resolveCurrentPage($pageName); - $total = value($total) ?? $this->getCountForPagination(); + $total = value($total) ?? $this->getCountForPagination($countColumns); $perPage = value($perPage, $total); diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index e5ddd15fd914..661ce5f81286 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -6148,6 +6148,7 @@ public function testPaginate() $columns = ['test']; $pageName = 'page-name'; $page = 1; + $countColumns = ['test']; $builder = $this->getMockQueryBuilder(); $path = 'http://foo.bar?page=3'; @@ -6161,7 +6162,7 @@ public function testPaginate() return $path; }); - $result = $builder->paginate($perPage, $columns, $pageName, $page); + $result = $builder->paginate($perPage, $columns, $pageName, $page, countColumns: $countColumns); $this->assertEquals(new LengthAwarePaginator($results, 2, $perPage, $page, [ 'path' => $path, @@ -6235,6 +6236,7 @@ public function testPaginateWithSpecificColumns() $columns = ['id', 'name']; $pageName = 'page-name'; $page = 1; + $countColumns = ['id']; $builder = $this->getMockQueryBuilder(); $path = 'http://foo.bar?page=3'; @@ -6248,7 +6250,7 @@ public function testPaginateWithSpecificColumns() return $path; }); - $result = $builder->paginate($perPage, $columns, $pageName, $page); + $result = $builder->paginate($perPage, $columns, $pageName, $page, countColumns: $countColumns); $this->assertEquals(new LengthAwarePaginator($results, 2, $perPage, $page, [ 'path' => $path, @@ -6262,6 +6264,7 @@ public function testPaginateWithTotalOverride() $columns = ['id', 'name']; $pageName = 'page-name'; $page = 1; + $countColumns = ['id']; $builder = $this->getMockQueryBuilder(); $path = 'http://foo.bar?page=3'; @@ -6275,7 +6278,7 @@ public function testPaginateWithTotalOverride() return $path; }); - $result = $builder->paginate($perPage, $columns, $pageName, $page, 10); + $result = $builder->paginate($perPage, $columns, $pageName, $page, 10, $countColumns); $this->assertEquals(10, $result->total()); }