2010-11-11 41 views
5

所以我看到的Zend PAGINATE工作的方式是,你做的:如何使用Zend的PAGINATE沒有裝載數據庫的所有結果

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

其中$結果是一個加載大量項目的結果在

"SELECT * FROM table WHERE etc" 

然後Zend的PAGINATE形式數據庫將計算結果的數量和產生的頁面自動範圍...

但是,如果你這樣做,那麼你將不得不取所有我認爲是浪費的數據庫結果,因爲一次只顯示一個頁面,因此您只需要獲取該頁面的項目...

如何讓zend分頁以便能夠計算正確的頁面範圍和數字,而不訴諸整個表的所有結果?

+0

它的像這樣的事情,提醒我,爲什麼我不使用Zend的... – ircmaxell 2010-11-11 17:43:18

+0

@ircmaxell Zend公司是好的,但它需要一些工作,弄清楚它的錯綜複雜。實際上,您可以製作非常優雅的代碼,而不必訴諸許多類擴展和覆蓋。 – 2010-11-19 20:39:46

回答

4

使用工廠方法,您可以發送Zend_Db_Select或Zend_Db_Table_Select的實例。如果你是類的擴展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

限制30,60不正確。你希望它讀取極限30,30。第一個參數是偏移量,第二個是行數。你現在擁有它的方式,它將從偏移量30開始返回60行。 – thetaiko 2010-11-11 17:46:53

0

您必須以不同方式使用zend paginator。請查看documentation的功能。回到「DbSelect和DbTableSelect適配器」部分,它提供了一個關於如何選擇記錄數而不是獲取所有記錄的例子。

0

這取決於你用什麼樣的適配器上。如果使用Zend_Paginator_Adapter_Array,則zend分頁程序將按數組長度計算頁面範圍等。但是,如果您使用Zend_Paginator_Adapter_DbSelect,則zend分頁程序將根據您的查詢自動創建查詢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 2012-07-27 23:41:14

相關問題