2012-11-28 16 views
0

我相對較新的Zend框架只能使用它大概1個月。我有一個運行速度太慢的查詢。該頁面需要幾分鐘才能加載。在我的查詢中,是抓取所有記錄還是僅獲取頁面所需的數量?我可以在從數據庫中獲取內容時應用限制嗎?如何在不加載數據庫的所有結果的情況下使用Zend分頁?

我的代碼如下。

public function init() { 
    $db = Zend_Registry::get('db'); 
    $sql = 'SELECT * FROM employee '; 
    $result = $db->fetchAll($sql); 
    $page=$this->_getParam('page',1); 
    $paginator = Zend_Paginator::factory($result); 
    $paginator->setItemCountPerPage(5); 
    $paginator->setCurrentPageNumber($page); 
    $this->view->paginator=$paginator;   
} 

我會很樂意爲您提供任何幫助。

回答

0

由於您向Paginator工廠提供了一個Db查詢,Paginator在大多數情況下會使用DbSelect Paginator適配器。該適配器將使最小的查詢成爲可能,以滿足Paginator的需求。

要確保Paginator使用正確的適配器,您可以傳遞一個字符串作爲第二個參數。從參考

$paginator = Zend_Paginator::factory($result, 'DbSelect');

摘錄:

注:而不是選擇一個給定的查詢的每個匹配行中, DbSelect和DbTableSelect適配器只檢索需要的數據量最小 用於顯示當前頁面。

因此,動態生成第二個查詢以確定匹配行的總數。但是,可以直接 自己提供計數或計數查詢。有關更多信息,請參閱DbSelect適配器中的setRowCount()方法 。

如果您使用數據庫分析,您可以看到生成限制和偏移量查詢的位置。

注:

在大多數情況下Zend_Db的將其轉換SQL查詢,選擇到Zend_Db_Select對象的對象。如果你發現你在極少數情況下不是這種情況,你需要使用Paginator的數組適配器,或者將你的sql重構爲Zend_Db_Select對象。這應該是非常罕見的。

另外,在init()方法中看到一個paginator實例是很不尋常的。 init()將在對該控制器的每個請求上運行。

相關問題