2010-11-11 14 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

相关问题