From dad8ca6430ead5fcfe1292226232a59c66aefd9e Mon Sep 17 00:00:00 2001 From: Martin Zurowietz Date: Tue, 9 Aug 2016 10:38:29 +0200 Subject: [PATCH] Support column aliases in chunkById References #14499 --- src/Illuminate/Database/Query/Builder.php | 7 +++++-- tests/Database/DatabaseQueryBuilderTest.php | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Query/Builder.php b/src/Illuminate/Database/Query/Builder.php index 76606b70f09a..d6163b0b967d 100755 --- a/src/Illuminate/Database/Query/Builder.php +++ b/src/Illuminate/Database/Query/Builder.php @@ -1783,12 +1783,15 @@ public function chunk($count, callable $callback) * @param int $count * @param callable $callback * @param string $column + * @param string $alias Alias of the ID column if there are multiple columns with the same name. The alias must be defined in a select statement. * @return bool */ - public function chunkById($count, callable $callback, $column = 'id') + public function chunkById($count, callable $callback, $column = 'id', $alias = null) { $lastId = null; + $alias = is_null($alias) ? $column : $alias; + $results = $this->forPageAfterId($count, 0, $column)->get(); while (! empty($results)) { @@ -1796,7 +1799,7 @@ public function chunkById($count, callable $callback, $column = 'id') return false; } - $lastId = last($results)->{$column}; + $lastId = last($results)->{$alias}; $results = $this->forPageAfterId($count, $lastId, $column)->get(); } diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index d9c101398859..7e9e9b15b091 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1667,6 +1667,19 @@ public function testChunkPaginatesUsingId() }, 'someIdField'); } + public function testChunkPaginatesUsingIdWithAlias() + { + $builder = $this->getMockQueryBuilder(); + $builder->shouldReceive('forPageAfterId')->once()->with(2, 0, 'table.id')->andReturn($builder); + $builder->shouldReceive('forPageAfterId')->once()->with(2, 10, 'table.id')->andReturn($builder); + $builder->shouldReceive('get')->times(2)->andReturn( + [(object) ['table_id' => 1], (object) ['table_id' => 10]], + [] + ); + $builder->chunkById(2, function ($results) { + }, 'table.id', 'table_id'); + } + public function testPaginate() { $perPage = 16;