Zend 2 Paginator, как это работает?

Я пытаюсь понять 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?

0

Решение

Из официальной документации: Zend Paginator Использование

Заметка


Вместо выбора каждой подходящей строки данного запроса, DbSelect
адаптер извлекает только минимальное количество данных, необходимых для
отображение текущей страницы. Из-за этого второй запрос
динамически генерируется для определения общего количества совпадающих строк.

Если вы используете Zend \ Paginator \ адаптер \ DbSelect это будет применяться limit а также offset на запрос, который вы передаете, и он просто выберет нужные записи. Это сделано в getItems() функция DbSelectВы могли видеть это эти строки в исходном коде.

Вы также можете прочитать это из документации:

Этот адаптер делает не получить все записи из базы данных в порядке
считать их. Вместо этого адаптер манипулирует исходным запросом
произвести соответствующий COUNT запрос. Paginator затем выполняет это
COUNT запрос, чтобы получить количество строк. Это требует дополнительного обхода базы данных, но это во много раз быстрее, чем
извлечение всего набора результатов и использование count()особенно с
большие коллекции данных.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]