5.6. Zend_Db_Table_Rowset

5.6.1. 導入

Zend_Db_Table_Rowset は、Zend_Db_Table_Row オブジェクトの集合に対するイテレータです。 一般に Zend_Db_Table_Rowset のインスタンスを直接生成することはありません。 その代わりに、Zend_Db_Table::find() や fetchAll() の返す結果として Zend_Db_Table_Rowset を取得します。Zend_Db_Table_Row の集合を順にたどり、必要ならば変更していくことが可能です。

5.6.2. 行セットの取得

最初に Zend_Db_Table クラスのインスタンスを作成します。

<?php
// アダプタを設定します
require_once 'Zend/Db.php';
$params = array (
    'host'     => '127.0.0.1',
    'username' => 'malory',
    'password' => '******',
    'dbname'   => 'camelot'
);

$db = Zend_Db::factory('PDO_MYSQL', $params);

// すべての Zend_Db_Table オブジェクトに対するデフォルトアダプタを設定します
require_once 'Zend/Db/Table.php';
Zend_Db_Table::setDefaultAdapter($db);

// データベースのテーブルに接続します
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
?>
        

次に、Zend_Db_Table::find() に複数のキーを指定するか Zend_Db_Table::fetchAll() を使用して、データベースから複数のレコードを取得します。 返される結果は Zend_Db_Table_Rowset オブジェクトであり、 レコードセット内の個々の Zend_Db_Table_Row オブジェクトにアクセスすることが可能です。

<?php
// テーブルから複数のレコードを取得します
$rowset = $table->fetchAll();

//
// $rowset は Zend_Db_Table_Rowset オブジェクトで、結果の各レコードを
// Zend_Db_Table_Row オブジェクトで表したものの集合です
//
?>
        

5.6.3. 行セットの順次処理

Zend_Db_Table_Rowset は SPL Iterator インターフェイスを実装しています。 つまり、配列と同様に Zend_Db_Table_Rowset を foreach() で処理できるということです。 foreach() で取得できる値は Zend_Db_Table_Row で、 これがテーブルのひとつのレコードに対応します。 このレコードについて閲覧や変更、そしてプロパティの保存ができます。

<?php
// データベースのテーブルに接続します
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();

// テーブルから複数のレコードを取得します
$rowset = $table->fetchAll();

// すべて表示します
foreach ($rowset as $row) {
    // $row は Zend_Db_Table_Row オブジェクトです
    echo "<p>" . htmlspecialchars($row->nobleTitle) . " "
       . htmlspecialchars($row->firstName) . "'s "
       . "favorite color is " . htmlspecialchars($row->favoriteColor)
       . ".</p>\n";

    // この行の表示回数を更新します
    // (これは、テーブルのカラム "times_displayed" に対応します)
    $row->timesDisplayed ++;

    // 新しい情報でレコードを更新します
    $row->save();
}
?>