Создан, но не выполнен Генератор. Генератор с отложенной загрузкой - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть следующий генератор PHP:

<?php

class DatabaseReader
{
    private $database;

    ...

    public function read(int $batchSize): \Generator
    {
        $fromId = 0;

        do {
            $data = $this->database->query("SELECT * FROM Users WHERE id > $fromId LIMIT $batchSize"); // dummy example

            foreach ($data as $row) {
                $fromId = $row['id'];

                yield $row;
            }
        } while ($batchSize === count($data));
    }
}

Дело в том, что мне нужно создать генератор, но пока не выполнять никаких запросов к базе данных. Что-то вроде ленивой инициации read(...).

Пример:

<?php

function printMyData(\Iterator $iterator) {
    foreach ($iterator as $element) { // Execute the first Database query
        var_dump($element);
    }
}

$reader = new DatabaseReader(...);

...

// some logic here.

$iterator = $reader->read(...); // I want to have a Generator object here, but not executed `read(...)`.

...
// some other work here
// at this point, no queries should be executed yet
...

printMyData($iterator);

Есть идеи?

Примечание: это гипотетический сценарий. Одним из решений будет создание ленивого итератора, который будет выполнять DatabaseReader::read на самой первой итерации и передавать все методы на \Generator, созданный read(...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...