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()
, так далее
В общем, есть две причины, почему это быстро:
- Фактический объект очищается (запрос и связанная информация)
- Затем он передается в итератор, который быстро
Вы можете спросить, почему итераторы быстрые? Хорошо, потому что они обрабатывают данные итеративно, а не буферизуют в памяти.
Узнайте о здесь: