diff --git a/src/Illuminate/Database/Eloquent/Builder.php b/src/Illuminate/Database/Eloquent/Builder.php index da09c5eb93c7..cd18ece7ffba 100755 --- a/src/Illuminate/Database/Eloquent/Builder.php +++ b/src/Illuminate/Database/Eloquent/Builder.php @@ -332,7 +332,7 @@ public function value($column) * * @param int $count * @param callable $callback - * @return bool + * @return bool */ public function chunk($count, callable $callback) { @@ -357,10 +357,10 @@ public function chunk($count, callable $callback) /** * Chunk the results of a query by comparing numeric IDs. * - * @param int $count - * @param callable $callback - * @param string $column - * @return bool + * @param int $count + * @param callable $callback + * @param string $column + * @return bool */ public function chunkById($count, callable $callback, $column = 'id') { @@ -373,9 +373,7 @@ public function chunkById($count, callable $callback, $column = 'id') return false; } - if ($column) { - $lastId = $results->last()->{$column}; - } + $lastId = $results->last()->{$column}; $results = $this->pageAfterId($count, $lastId, $column)->get(); } diff --git a/src/Illuminate/Database/Query/Builder.php b/src/Illuminate/Database/Query/Builder.php index a5261efe3873..d10972679db1 100755 --- a/src/Illuminate/Database/Query/Builder.php +++ b/src/Illuminate/Database/Query/Builder.php @@ -1335,10 +1335,10 @@ public function forPage($page, $perPage = 15) /** * Constrain the query to the next "page" of results after a given ID. * - * @param int $perPage - * @param int $column - * @param string $column - * @return Builder|static + * @param int $perPage + * @param int $lastId + * @param string $column + * @return \Illuminate\Database\Query\Builder|static */ public function pageAfterId($perPage = 15, $lastId = 0, $column = 'id') { @@ -1623,7 +1623,7 @@ protected function restoreFieldsForCount() * * @param int $count * @param callable $callback - * @return bool + * @return bool */ public function chunk($count, callable $callback) { @@ -1648,10 +1648,10 @@ public function chunk($count, callable $callback) /** * Chunk the results of a query by comparing numeric IDs. * - * @param int $count - * @param callable $callback - * @param string $column - * @return bool + * @param int $count + * @param callable $callback + * @param string $column + * @return bool */ public function chunkById($count, callable $callback, $column = 'id') { @@ -1664,9 +1664,7 @@ public function chunkById($count, callable $callback, $column = 'id') return false; } - if ($column) { - $lastId = last($results)->{$column}; - } + $lastId = last($results)->{$column}; $results = $this->pageAfterId($count, $lastId, $column)->get(); } diff --git a/tests/Database/DatabaseEloquentBuilderTest.php b/tests/Database/DatabaseEloquentBuilderTest.php index 7fde71ddfccb..38ae46075bb2 100755 --- a/tests/Database/DatabaseEloquentBuilderTest.php +++ b/tests/Database/DatabaseEloquentBuilderTest.php @@ -194,7 +194,7 @@ public function testChunkCanBeStoppedByReturningFalse() }); } - public function testChunkPaginatesUsingWhereBetweenIds() + public function testChunkPaginatesUsingId() { $builder = m::mock('Illuminate\Database\Eloquent\Builder[pageAfterId,get]', [$this->getMockQueryBuilder()]); $builder->shouldReceive('pageAfterId')->once()->with(2, 0, 'someIdField')->andReturn($builder); diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index 742933220475..d0dbb36199b9 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1470,6 +1470,23 @@ public function testTableValuedFunctionAsTableInSqlServer() $this->assertEquals('select * from [users](1,2)', $builder->toSql()); } + public function testChunkPaginatesUsingId() + { + $builder = $this->getMockQueryBuilder(); + + $builder->shouldReceive('pageAfterId')->once()->with(2, 0, 'someIdField')->andReturn($builder); + $builder->shouldReceive('pageAfterId')->once()->with(2, 2, 'someIdField')->andReturn($builder); + $builder->shouldReceive('pageAfterId')->once()->with(2, 10, 'someIdField')->andReturn($builder); + + $builder->shouldReceive('get')->times(3)->andReturn( + [(object) ['someIdField' => 1], (object) ['someIdField' => 2]], + [(object) ['someIdField' => 10]], + [] + ); + + $builder->chunkById(2, function ($results) {}, 'someIdField'); + } + protected function getBuilder() { $grammar = new Illuminate\Database\Query\Grammars\Grammar; @@ -1517,4 +1534,18 @@ protected function getMySqlBuilderWithProcessor() return new Builder(m::mock('Illuminate\Database\ConnectionInterface'), $grammar, $processor); } + + /** + * @return m\MockInterface + */ + protected function getMockQueryBuilder() + { + $builder = m::mock('Illuminate\Database\Query\Builder[pageAfterId,get]', [ + m::mock('Illuminate\Database\ConnectionInterface'), + new Illuminate\Database\Query\Grammars\Grammar, + m::mock('Illuminate\Database\Query\Processors\Processor'), + ]); + + return $builder; + } }