2010-11-11 2 views
5

Так как я вижу Зенд постраничной работы является то, что вы делаете:как использовать ZEND разбивать на страницы без загрузки всех результатов базы данных

$paginator = Zend_Paginator::factory($results); 
$paginator->setItemCountPerPage($itemCount); 
$paginator->setPageRange($pageRange); 

Где $ Результаты является результатом загрузки кучу элементов из базы данных в виде

"SELECT * FROM table WHERE etc" 

Тогда ZEND постраничной будет подсчитывать количество результатов и генерировать диапазоны страниц автоматически ...

Но если вы сделаете это, то вы будете иметь, чтобы е трассировать все результаты базы данных, которые я вижу как отходы, поскольку отображается только одна страница за раз, и поэтому вам нужно всего лишь выбрать элементы для этой страницы ...

Как вы делаете zend paginate, чтобы иметь возможность рассчитать правильные диапазоны страниц и номера, не прибегая к извлечению всех результатов всей таблицы?

+0

Это такие вещи, которые напоминают мне о том, почему я не использую Zend ... – ircmaxell

+0

@ircmaxell Zend это хорошо, но он принимает некоторые работы выяснить его тонкости. Вы действительно можете сделать очень элегантный код, не прибегая ко многим расширениям и переопределениям класса. –

ответ

4

Используя заводской метод, вы можете отправить экземпляр Zend_Db_Select или Zend_Db_Table_Select. Если вы класс extends Zend_Db_Table_Abstract, вы можете просто построить из него запрос выбора, а затем отправить это. Если вы не можете создать экземпляр и отправить его, смотрите пример из документации:

$adapter = new Zend_Paginator_Adapter_DbSelect($db->select()->from('posts')); 
    $adapter->setRowCount(
     $db->select() 
      ->from(
       'item_counts', 
       array(
        Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count' 
       ) 
      ) 
    ); 

$paginator = new Zend_Paginator($adapter) 

http://framework.zend.com/manual/en/zend.paginator.usage.html#zend.paginator.usage.dbselect

0

Zend_Paginator Вы должны сделать это самостоятельно, но это очень просто, измените запрос к этой форме: SELECT * FROM table WHERE etc LIMIT 0, 30 тогда, например, в этом случае вы получите первые 30 строк, если вы будете получать следующий затем используйте SELECT * FROM table WHERE etc LIMIT 30, 60

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

+3

LIMIT 30, 60 неверно. Вы хотите, чтобы он читал LIMIT 30, 30. Первый аргумент - это смещение, второе - значение rowcount. То, как у вас в настоящее время есть, будет возвращено 60 строк, начиная со смещения 30. – thetaiko

0

Вы должны использовать zend paginator по-разному. Посмотрите на функцию documentation. Перейдите к разделу «Адаптер DbSelect и DbTableSelect», в котором приведен пример выбора количества записей, а не выборки всех записей.

0

Это зависит от того, какого адаптера, который вы используете. Если вы используете Zend_Paginator_Adapter_Array, zend paginator будет вычислять диапазон страниц и т. Д. По длине массива. Но если вы используете Zend_Paginator_Adapter_DbSelect, zend paginator автоматически создаст запрос select count(*) ...... as zend_paginator_row_count на основе вашего запроса, чтобы рассчитать количество строк, и он не будет загружать все результаты вашей базы данных.

0

Zend_Db_Select и Zend_Db_Table_Select - отличные способы решения вашей проблемы, проблема, с которой мне пришлось столкнуться всего полгода назад.

Давайте предположим, что у меня есть таблица книг в моей базе данных, и я определил функцию поиска, чтобы позволить мне сделать полнотекстовый поиск по всей полей таблицы:

Default_Model_DbTable_Books.php:

public class Default_Model_DbTable_Books extends Zend_Db_Table_Abstract { 

    // Other variables and methods here... 

    public function search($query) { 
     // Initialize Zend_Db_Table_Select object 
     $select = $this->select(true); 

     if (isset($query) && is_string($query)) { 
      // Logic for search (don't actually do this, it's horrible for performance) 
      $db = $this->getAdapter(); 
      $where = $db->quoteInto('isbn LIKE ? OR name LIKE ? OR author LIKE ?', $query); 
      $search->where($where) 
        ->order('date_published DESC') 
        ->group('author'); 
     } 

     return $select; 
    } 
} 

Default_Model_Mapper_Book.PHP:

public class Default_Model_Mapper_Book { 

    // Defined functions as per Zend Quickstart Mapper classes... 

    public function search($query) { 
     // Returns Zend_Db_Table_Select object 
     return $this->getDbTable()->search($query); 
    } 
} 

Default_BooksController.php:

public function listAction() { 
    $mapper = new Default_Model_Mapper_Book(); 
    $select = $mapper->search($this->_getParam("query")); 
    $paginator = Zend_Paginator::factory($select); 
} 
+0

Почему вы добавляете здесь еще один уровень абстракции (Mapper), поскольку он всегда вызывает метод и возвращает результат без дополнительной логики? – jkulak