2010-11-11 12 views
5

Więc sposób widzę pracę Zend paginate jest to zrobić:jak używać zend paginate bez ładowania wszystkie wyniki bazie

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

gdzie $ wyników jest efektem ładuje kilka elementów z baza danych w formie

"SELECT * FROM table WHERE etc" 

następnie zend paginate będzie policzyć liczbę wyników i generowania strony waha się automatycznie ...

Ale jeśli to zrobisz to jesteś będzie musiał pobrać wszystkie wyniki z bazy danych, którą widzę jako odpady, ponieważ tylko jedna strona jest wyświetlana w tym samym czasie, a więc wystarczy tylko pobrać pozycje dla tej strony ...

jak zrobić zend paginate, aby móc obliczyć prawidłowe zakresy i numery stron bez odwoływania się do pobierania wszystkich wyników z całej tabeli?

+0

rzeczy To jest tak, że przypominają mi, dlaczego nie używam Zend ... – ircmaxell

+0

@ircmaxell Zend jest w porządku, ale to wymaga trochę pracy odkryć jego zawiłości. W rzeczywistości możesz stworzyć bardzo elegancki kod bez uciekania się do wielu rozszerzeń klas i nadpisań. –

Odpowiedz

4

Przy użyciu metody fabrycznej można wysłać wystąpienie Zend_Db_Select lub Zend_Db_Table_Select. Jeśli twoja klasa rozszerza Zend_Db_Table_Abstract, możesz po prostu utworzyć z niej zapytanie, a następnie wysłać to. Jeśli nie można utworzyć instancję i wysłać go, zobacz przykład z docs:

$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

Nie możesz tego zrobić z Zend_Paginator musisz zrobić to sam, ale to jest bardzo proste, zmień zapytanie do tego formularza: SELECT * FROM table WHERE etc LIMIT 0, 30 następnie na przykład w tym przypadku otrzymasz pierwsze 30 wierszy, jeśli dostaniesz następne następnie użyj SELECT * FROM table WHERE etc LIMIT 30, 60

w inny sposób pamiętać, funkcja który dostaniesz ramy nie zawsze jest optymalna i pracy z najprostszych do wdrożenia złożoność bo dla najszybszych rozwiązań trzeba użyć trochę mocniej w kodzie użycia (to znaczy, że nie mogą korzystać z tego kod w wielu przypadkach nie jak w najgorszym kodowaniu złożoności), rozwiązania są bardziej dedykowane do problemu, tak jak to, dedykujesz się do mysql, Paginator nie działają na warstwie bazy danych, a on pracuje tylko na podstawie danych wejściowych, gdzie wejście jest wszystkie wiersze, ten kod nie może zrobić tego szybciej.

+3

LIMIT 30, 60 jest niepoprawny. Chcesz, aby odczytał LIMIT 30, 30. Pierwszy argument to przesunięcie, drugi to liczba wierszy. Sposób, w jaki go obecnie posiadasz, zwróci 60 wierszy zaczynając od przesunięcia 30. – thetaiko

0

Musisz inaczej używać zend paginator. Proszę spojrzeć na documentation dla tej funkcji. Przejdź do sekcji "Adapter DbSelect i DbTableSelect", która pokazuje przykład wyboru liczby rekordów zamiast pobierania wszystkich rekordów.

0

To zależy od adaptera, którego używasz. Jeśli użyjesz Zend_Paginator_Adapter_Array, zend paginator obliczy zakres stron i tak dalej przez długość tablicy. Ale jeśli użyjesz Zend_Paginator_Adapter_DbSelect, zend paginator automatycznie utworzy zapytanie select count(*) ...... as zend_paginator_row_count w oparciu o zapytanie, aby obliczyć liczbę wierszy i nie załaduje wszystkich wyników bazy danych.

0

Zend_Db_Select i Zend_Db_Table_Select to świetne sposoby na rozwiązanie problemu, problem, z którym miałem do czynienia zaledwie sześć miesięcy temu.

Załóżmy Mam tabeli książek w mojej bazy danych i definiuje funkcję wyszukiwania, aby umożliwić mi zrobić wyszukiwania pełnotekstowego całym polach na stole za:

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

Dlaczego dodasz tutaj kolejny poziom abstrakcji (Mapper), ponieważ zawsze wywołuje on metodę i zwraca wynik bez dodatkowej logiki? – jkulak

Powiązane problemy