Использование конкретного Zend_Db_Table_Abstract для эффективной итерации набора строк - PullRequest
6 голосов
/ 24 июня 2011

Я использую конкретную реализацию 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 ]

3 голосов
/ 24 июня 2011

Тогда 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 голос
/ 24 июня 2011

Можете ли вы указать цель получения всех строк вместе? Потому что, если вы хотите выполнить какую-то обработку для всех строк в таблице, вы можете каким-либо образом получить все строки в памяти. С другой стороны, если вы хотите сделать что-то вроде разбивки на страницы, вы всегда можете использовать объект zend_pagination, который просто получит ограниченное число no. рядов одновременно. Или еще лучше, вы можете установить смещение и нет. строк, которые нужно получить в самой функции fetchAll.

...