diff --git a/src/Jenssegers/Mongodb/Eloquent/Builder.php b/src/Jenssegers/Mongodb/Eloquent/Builder.php index 46d715fe9..1ee1c41fe 100644 --- a/src/Jenssegers/Mongodb/Eloquent/Builder.php +++ b/src/Jenssegers/Mongodb/Eloquent/Builder.php @@ -143,6 +143,14 @@ public function decrement($column, $amount = 1, array $extra = []) return parent::decrement($column, $amount, $extra); } + /** + * @inheritdoc + */ + public function chunkById($count, callable $callback, $column = '_id', $alias = null) + { + return parent::chunkById($count, $callback, $column, $alias); + } + /** * @inheritdoc */ diff --git a/src/Jenssegers/Mongodb/Query/Builder.php b/src/Jenssegers/Mongodb/Query/Builder.php index 736ce2629..3760525aa 100644 --- a/src/Jenssegers/Mongodb/Query/Builder.php +++ b/src/Jenssegers/Mongodb/Query/Builder.php @@ -600,6 +600,28 @@ public function decrement($column, $amount = 1, array $extra = [], array $option return $this->increment($column, -1 * $amount, $extra, $options); } + /** + * @inheritdoc + */ + public function chunkById($count, callable $callback, $column = '_id', $alias = null) + { + return parent::chunkById($count, $callback, $column, $alias); + } + + /** + * @inheritdoc + */ + public function forPageAfterId($perPage = 15, $lastId = 0, $column = '_id') + { + // When using ObjectIDs to paginate, we need to use a hex string as the + // "minimum" ID rather than the integer zero so the '$lt' query works. + if ($column === '_id' && $lastId === 0) { + $lastId = '000000000000000000000000'; + } + + return parent::forPageAfterId($perPage, $lastId, $column); + } + /** * @inheritdoc */ diff --git a/tests/ModelTest.php b/tests/ModelTest.php index 30b396ff7..05cc58e56 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -534,4 +534,18 @@ public function testGetDirtyDates() $user->birthday = new DateTime('19 august 1989'); $this->assertEmpty($user->getDirty()); } + + public function testChunkById() + { + User::create(['name' => 'fork', 'tags' => ['sharp', 'pointy']]); + User::create(['name' => 'spork', 'tags' => ['sharp', 'pointy', 'round', 'bowl']]); + User::create(['name' => 'spoon', 'tags' => ['round', 'bowl']]); + + $count = 0; + User::chunkById(2, function ($items) use (&$count) { + $count += count($items); + }); + + $this->assertEquals(3, $count); + } }