使用具体的Zend_Db_Table_Abstract有效地遍历行集

时间:2011-06-24 10:45:22

标签: php zend-framework zend-db

我正在使用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()?这样可以在不占用过多内存的情况下有效访问任意数量的行(数千,数百万)。

提前感谢任何建议。

2 个答案:

答案 0 :(得分:3)

然后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 ();

        }

答案 1 :(得分:1)

您能指定一起获取所有行的目的吗?因为如果你想对表中的所有行进行某种处理,那么你需要将所有行放到内存中。另一方面,如果你想做像分页这样的事情,你总是可以使用zend_pagination对象来获取有限的no。一次排。或者更好的是你可以设置偏移量而不是。要在fetchAll函数本身中获取的行。