Я пытаюсь понять Zend Paginator
и в основном хотел бы убедиться, что это не нарушает мои сценарии.
Например, у меня есть следующий фрагмент, который успешно загружает несколько контактов по одному:
$offset = 1;
//returns a paginator instance using a dbSelect;
$contacts = $ContactsMapper->fetchAll($fetchObj);
$contacts->setCurrentPageNumber($offset);
$contacts->setItemCountPerPage(1);
$allContacts = count($contacts);
while($allContacts >= $offset) {
foreach($contacts as $contact) {
//do something
}
$offset++;
$contacts->setCurrentPageNumber($offset);
$contacts->setItemCountPerPage(1);
}
Тем не менее, я могу иметь сотни тысяч контактов в базе данных и соответствовать SELECT
Я отправляю к пагинатору. Могу ли я быть уверен, что в этом примере загружается только по одной? И как он это делает, выполняет ли пользовательский запрос с limit
а также offset
?
Из официальной документации: Zend Paginator Использование
Заметка
Вместо выбора каждой подходящей строки данного запроса,
DbSelect
адаптер извлекает только минимальное количество данных, необходимых для
отображение текущей страницы. Из-за этого второй запрос
динамически генерируется для определения общего количества совпадающих строк.
Если вы используете Zend \ Paginator \ адаптер \ DbSelect это будет применяться limit
а также offset
на запрос, который вы передаете, и он просто выберет нужные записи. Это сделано в getItems()
функция DbSelect
Вы могли видеть это эти строки в исходном коде.
Вы также можете прочитать это из документации:
Этот адаптер делает не получить все записи из базы данных в порядке
считать их. Вместо этого адаптер манипулирует исходным запросом
произвести соответствующий COUNT запрос. Paginator затем выполняет это
COUNT запрос, чтобы получить количество строк. Это требует дополнительного обхода базы данных, но это во много раз быстрее, чем
извлечение всего набора результатов и использованиеcount()
особенно с
большие коллекции данных.
Других решений пока нет …