使用具体的Zend_Db_Table_Abstract有效地迭代行集


Using concrete Zend_Db_Table_Abstract to efficiently iterate through a rowset

我使用的是Zend_Db_Table_Abstract:的具体实现

class DB_TestClass extends Zend_Db_Table_Abstract {
    protected $_name = "test.TestData";
}

如果我想选择表中的所有行,我似乎有一个选项:

$t = new DB_TestClass;
$rowset = $t->fetchAll();

这返回Zend_Db_Table_Rowset的一个实例,该实例具有一个可迭代接口,您可以循环使用该接口,并将每个行条目作为rowClass实例访问:

foreach($rowset as $row) {
    var_dump($row);
}  

然而,行集已经将数据库中的每一行都加载到内存中(!)对于小表,这是可以的,但对于大表,例如数千行,它会迅速耗尽PHP可用的内存,脚本就会失效。

如何使用Zend_Db在结果集中迭代,每次从语句句柄中检索一行,ala mysql_fetch_assoc()?这将允许在不使用过多内存的情况下高效访问任意数量的行(数千、数百万)。

提前感谢您的任何建议。

然后fetchAll()不能满足您的需要。您需要使用Zend_Db_Select来获取所有记录,然后通过循环执行您想要的操作

        $select = new Zend_Db_Select ($this->getFrontController()->getParam('bootstrap')->getResource ('Db'));
        $statement = $select->from ('verses')->query ();
        $statement->execute ();

        while ($row = $statement->fetch ())
        {
            // try something like that
            $db_row = new Zend_Db_Table_Row (array ('table' => $table, 'data' => $row));
            $db_row->text = $db_row->text . '_';
            $db_row->save ();
        }

您能指定将所有行提取到一起的目的吗?因为如果你想对表中的所有行进行某种处理,那么你必须以任何方式将所有行都放入内存。另一方面,如果你想做一些类似分页的事情,你可以总是使用zend_pagination对象,它一次只获取有限的行数。或者更好的是,您可以在fetchAll函数本身中设置要提取的偏移量和行数。