CodeIgniter DataMapper get_iterated

Может кто-нибудь дать объяснение разницы между get() а также get_iterated() в контексте DataMapper ORM CodeIgniter упоминается здесь:

http://datamapper.wanwizard.eu/pages/getalt.html

Я прочитал это несколько раз, но не понимаю. Я также вывел результат запросов с использованием каждого метода, но не вижу разницы. Я могу подтвердить, что get_iterated() определенно использует намного меньше памяти, чем get(), но я хотел бы понять, что на самом деле происходит.

Я надеюсь, что кто-то может дать четкое объяснение. Спасибо!

1 ответ

Вот реализация get_iterated() (комментарии мои):

public function get_iterated($limit = NULL, $offset = NULL)
{
     // get hold of object after it is cleared though call to get_row
    $object = $this->get_clone();
    // clears the query from the clone
    $object->db->dm_call_method('_reset_select');
    // clear the related query from the clone
    $object->_query_related = array();

    // REAL MAGIC starts here: Build iterator
    $this->_dm_dataset_iterator = new DM_DatasetIterator($object, $this->get_raw($limit, $offset, TRUE));
    return $this;
}

Настоящая магия происходит на линии:

$this->_dm_dataset_iterator = new DM_DatasetIterator($object, $this->get_raw($limit, $offset, TRUE));

Реальная быстрая работа выполняется DM_DatasetIterator класс для get_iterated() метод, потому что он реализует Iterator которые, как правило, БЫСТРО. Класс реализует все необходимые методы, которые требуются Iterator интерфейс, такой как current(), key(), get(), так далее

В общем, есть две причины, почему это быстро:

  • Фактический объект очищается (запрос и связанная информация)
  • Затем он передается в итератор, который быстро

Вы можете спросить, почему итераторы быстрые? Хорошо, потому что они обрабатывают данные итеративно, а не буферизуют в памяти.

Узнайте о здесь:

Другие вопросы по тегам