9.5. Zend_Db_Table_Row

9.5.1. 導入

Zend_Db_Table_Row は、Zend_Db_Table オブジェクトの個々の行を含むクラスです。 テーブルクラスに対してクエリを実行すると、返される結果は Zend_Db_Table_Row オブジェクトのセットとなります。 このオブジェクトを使用して新しい行を作成し、 それをデータベースのテーブルに追加することもできます。

Zend_Db_Table_Row は、 行データゲートウェイ パターンを実装したものです。

9.5.2. 行の取得

Zend_Db_Table_Abstract は find()fetchAll() といったメソッドを提供します。 これらはそれぞれ Zend_Db_Table_Rowset 型のオブジェクトを返します。 また fetchRow() メソッドは、 Zend_Db_Table_Row 型のオブジェクトを返します。

例 9.55. 行の取得の例

<?php

$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');

?>

Zend_Db_Table_Rowset オブジェクトには、複数の Zend_Db_Table_Row オブジェクトが含まれます。 項9.6. 「Zend_Db_Table_Rowset」 を参照ください。

例 9.56. 行セット内の行を読み込む例

<?php

$bugs = new Bugs();
$rowset = $bugs->fetchAll("bug_status = 'NEW'");
$row = $rowset->current();

?>

9.5.2.1. 行からのカラムの値の読み込み

Zend_Db_Table_Row_Abstract にはアクセサがあり、 行のカラムをオブジェクトのプロパティとして参照できます。

例 9.57. 行からカラムを読み込む例

<?php

$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');

// bug_description カラムの値を出力します
echo $row->bug_description;

?>
[注意] 注意

初期のバージョンの Zend_Db_Table_Row では、 これらのアクセサをデータベースのカラムと対応させる際に 語尾変化 (inflection) と呼ばれる文字列変換を行っていました。

現在の Zend_Db_Table_Row では語尾変化を実装していません。 使用するアクセサ名は、データベース内のカラム名と正確に一致します。

9.5.2.2. 行データの配列としての取得

行のデータに対して配列としてアクセスするには、行オブジェクトの toArray() メソッドを使用します。 これは、カラム名とその値を関連付けた連想配列を返します。

例 9.58. toArray() メソッドの使用例

<?php

$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');

// 行オブジェクトから カラム名/値 の連想配列を取得します
$rowArray = $row->toArray();

// 通常の配列と同様に使用します
foreach ($rowArray as $column => $value) {
    echo "カラム: $column\n";
    echo "値:  $value\n";
}

?>

9.5.2.3. 関連するテーブルからのデータの取得

Zend_Db_Table_Row_Abstract クラスには、関連するテーブルから 行や行セットを取得するメソッドが存在します。 テーブルのリレーションについての詳細な情報は 項9.7. 「Zend_Db_Table Relationships」 を参照ください。

9.5.3. データベースへの行の書き込み

9.5.3.1. 行のカラムの値の変更

個々のカラムの値をアクセサで設定する方法は、 カラムを読み込む場合と同様で、オブジェクトのプロパティを使用します。

これは、アプリケーション内の行データのカラムの値は変更しますが、 まだその変更はデータベースにコミットされていません。コミットするには save() メソッドを使用します。

例 9.59. 行のカラムの内容を変更する例

<?php

$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');

// ひとつあるいは複数のカラムの値を変更します
$row->bug_status = 'FIXED';

// データベース内の行を、新しい値で UPDATE します
$row->save();

?>
[注意] 注意

現在は、主キーカラムの値を設定しようとすると Zend_Db_Table_Row_Abstract は例外をスローします。 これは Zend Framework 1.0 までには変更するつもりです。 シーケンスや自然主キーに対応するため、 行クラスは主キーカラムの変更も受け入れるべきです。

9.5.3.2. 新しい行の挿入

指定したテーブルに新しい行を作成するには、テーブルクラスの fetchNew() メソッドを使用します。

例 9.60. テーブルに新しい行を作成する例

<?php

$bugs = new Bugs();
$newRow = $bugs->fetchNew();

// アプリケーションに応じて適切にカラムの値を設定します
$newRow->bug_description = '...description...';
$newRow->bug_status = 'NEW';

// 新しい行をデータベースに INSERT します
$newRow->save();

?>

9.5.3.3. 複数のカラムの値の変更

Zend_Db_Table_Row_Abstract の setFromArray() メソッドを使用すると、 複数のカラムを一度に設定することができます。 このメソッドには、カラム名と値を関連付けた連想配列を指定します。 このメソッドは、新しい行の値を設定する場合や 既存の行を更新する場合のどちらでも有用でしょう。

例 9.61. setFromArray() で新しい行の値を設定する例

<?php

$bugs = new Bugs();
$newRow = $bugs->fetchNew();

// データを連想配列形式にします
$data = array(
    'bug_description' => '...description...',
    'bug_status'      => 'NEW'
);

// すべてのカラムの値を一度に設定します
$newRow->setFromArray($data);

// 新しい行をデータベースに INSERT します
$newRow->save();

?>

9.5.3.4. 行の削除

行オブジェクトで delete() メソッドをコールすることができます。 これは、その行オブジェクトの主キーに対応するデータベースの行を削除します。

例 9.62. 行の削除の例

<?php

$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');

// この行を DELETE します
$row->delete();

?>

変更を適用するのに save() をコールする必要はありません。 これは、データベースに対して即時に適用されます。

9.5.4. 行のシリアライズと復元

データベースの行の内容を保存しておき、 あとで使用するということはよくありがちです。 オブジェクトの内容を、オフラインで保存しやすい形式 (たとえばファイルなど) に変換するような処理のことを シリアライズ といいます。 Zend_Db_Table_Row_Abstract 型のオブジェクトは、 シリアライズをすることができます。

9.5.4.1. 行のシリアライズ

あとで書く。

例 9.63. 行のシリアライズの例

<?php

$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');

// オブジェクトをシリアライズします
$serializedRow = serialize($row);

// これで、$serializedRow をファイルなどに書き出すことができます

?>

9.5.4.2. シリアライズした行データの復元

あとで書く。

例 9.64. シリアライズした行の復元の例

<?php

$rowClone = unserialize($serializedRow);

// これでオブジェクトのプロパティを使用できますが、読み込み専用です
echo $rowClone->bug_description;

?>

9.5.4.3. 生きたデータとしての行の復活

あとで書く。

例 9.65. 行の復活の例

<?php

$rowClone = unserialize($serializedRow);

$bugs = new Bugs();

// この行をテーブルに再接続し、
// データベースとの接続を復活させます
$rowClone->setTable($bugs);

// これで、行の内容を変更して保存することができます
$rowClone->bug_status = 'FIXED';
$rowClone->save();

?>

9.5.5. 行クラスの拡張

9.5.5.1. Zend_Db_Table_Row における Insert、Update および Delete の独自ロジックの定義

あとで書く。

9.5.5.2. Zend_Db_Table_Row における語尾変化の定義

テーブルのクラス名を RDBMS のテーブル名とあわせるために、 inflection (語尾変化) と呼ばれる文字列変換を使用することを好む方もいます。

Zend_Db クラス群は、デフォルトでは語尾変化をサポートしていません。 この設計方針については 項9.4.11.4. 「Zend_Db_Table における語尾変化の定義」 を参照ください。

語尾変化をさせたい場合は、変換処理を自前で実装する必要があります。そのためには、 独自の行クラスで _transformColumn() メソッドをオーバーライドし、 テーブルクラスでクエリを実行する際にその独自行クラスを使用します。

例 9.66. 語尾変化の変換処理の定義例

あとで書く。