diff --git a/src/Jenssegers/Mongodb/Query/Builder.php b/src/Jenssegers/Mongodb/Query/Builder.php index 5160915ed..c7383bbe2 100644 --- a/src/Jenssegers/Mongodb/Query/Builder.php +++ b/src/Jenssegers/Mongodb/Query/Builder.php @@ -8,6 +8,7 @@ use Illuminate\Database\Query\Expression; use Illuminate\Support\Arr; use Illuminate\Support\Collection; +use Illuminate\Support\LazyCollection; use Illuminate\Support\Str; use Jenssegers\Mongodb\Connection; use MongoCollection; @@ -15,7 +16,12 @@ use MongoDB\BSON\ObjectID; use MongoDB\BSON\Regex; use MongoDB\BSON\UTCDateTime; +use RuntimeException; +/** + * Class Builder + * @package Jenssegers\Mongodb\Query + */ class Builder extends BaseBuilder { /** @@ -209,12 +215,25 @@ public function get($columns = []) return $this->getFresh($columns); } + /** + * @inheritdoc + */ + public function cursor($columns = []) + { + $result = $this->getFresh($columns, true); + if ($result instanceof LazyCollection) { + return $result; + } + throw new RuntimeException("Query not compatible with cursor"); + } + /** * Execute the query as a fresh "select" statement. * @param array $columns - * @return array|static[]|Collection + * @param bool $returnLazy + * @return array|static[]|Collection|LazyCollection */ - public function getFresh($columns = []) + public function getFresh($columns = [], $returnLazy = false) { // If no columns have been specified for the select statement, we will set them // here to either the passed columns, or the standard default of retrieving @@ -402,6 +421,14 @@ public function getFresh($columns = []) // Execute query and get MongoCursor $cursor = $this->collection->find($wheres, $options); + if ($returnLazy) { + return LazyCollection::make(function () use ($cursor) { + foreach ($cursor as $item) { + yield $item; + } + }); + } + // Return results as an array with numeric keys $results = iterator_to_array($cursor, false); return $this->useCollections ? new Collection($results) : $results; diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index 6588be159..5bda5897a 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -3,6 +3,7 @@ use Illuminate\Support\Facades\Date; use Illuminate\Support\Facades\DB; +use Illuminate\Support\LazyCollection; use Jenssegers\Mongodb\Collection; use Jenssegers\Mongodb\Query\Builder; use MongoDB\BSON\ObjectId; @@ -759,4 +760,21 @@ public function testHintOptions() $this->assertEquals('spork', $results[1]['name']); $this->assertEquals('fork', $results[0]['name']); } + + public function testCursor() + { + $data = [ + ['name' => 'fork', 'tags' => ['sharp', 'pointy']], + ['name' => 'spork', 'tags' => ['sharp', 'pointy', 'round', 'bowl']], + ['name' => 'spoon', 'tags' => ['round', 'bowl']], + ]; + DB::collection('items')->insert($data); + + $results = DB::collection('items')->orderBy('_id', 'asc')->cursor(); + + $this->assertInstanceOf(LazyCollection::class, $results); + foreach ($results as $i => $result) { + $this->assertEquals($data[$i]['name'], $result['name']); + } + } }