Zend_Db_Table_Row は、Zend_Db_Table オブジェクトの個々の行を含むクラスです。 テーブルクラスに対してクエリを実行すると、返される結果は Zend_Db_Table_Row オブジェクトのセットとなります。 このオブジェクトを使用して新しい行を作成し、 それをデータベースのテーブルに追加することもできます。
Zend_Db_Table_Row は、 行データゲートウェイ パターンを実装したものです。
Zend_Db_Table_Abstract は find()
や
fetchAll()
といったメソッドを提供します。
これらはそれぞれ Zend_Db_Table_Rowset 型のオブジェクトを返します。
また fetchRow()
メソッドは、
Zend_Db_Table_Row 型のオブジェクトを返します。
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(); ?>
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 では語尾変化を実装していません。 使用するアクセサ名は、データベース内のカラム名と正確に一致します。 |
行のデータに対して配列としてアクセスするには、行オブジェクトの
toArray()
メソッドを使用します。
これは、カラム名とその値を関連付けた連想配列を返します。
Zend_Db_Table_Row_Abstract クラスには、関連するテーブルから 行や行セットを取得するメソッドが存在します。 テーブルのリレーションについての詳細な情報は 項9.7. 「Zend_Db_Table Relationships」 を参照ください。
個々のカラムの値をアクセサで設定する方法は、 カラムを読み込む場合と同様で、オブジェクトのプロパティを使用します。
これは、アプリケーション内の行データのカラムの値は変更しますが、
まだその変更はデータベースにコミットされていません。コミットするには
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 までには変更するつもりです。 シーケンスや自然主キーに対応するため、 行クラスは主キーカラムの変更も受け入れるべきです。 |
指定したテーブルに新しい行を作成するには、テーブルクラスの
fetchNew()
メソッドを使用します。
Zend_Db_Table_Row_Abstract の
setFromArray()
メソッドを使用すると、
複数のカラムを一度に設定することができます。
このメソッドには、カラム名と値を関連付けた連想配列を指定します。
このメソッドは、新しい行の値を設定する場合や
既存の行を更新する場合のどちらでも有用でしょう。
データベースの行の内容を保存しておき、 あとで使用するということはよくありがちです。 オブジェクトの内容を、オフラインで保存しやすい形式 (たとえばファイルなど) に変換するような処理のことを シリアライズ といいます。 Zend_Db_Table_Row_Abstract 型のオブジェクトは、 シリアライズをすることができます。
あとで書く。
あとで書く。
テーブルのクラス名を RDBMS のテーブル名とあわせるために、 inflection (語尾変化) と呼ばれる文字列変換を使用することを好む方もいます。
Zend_Db クラス群は、デフォルトでは語尾変化をサポートしていません。 この設計方針については 項9.4.11.4. 「Zend_Db_Table における語尾変化の定義」 を参照ください。
語尾変化をさせたい場合は、変換処理を自前で実装する必要があります。そのためには、
独自の行クラスで _transformColumn()
メソッドをオーバーライドし、
テーブルクラスでクエリを実行する際にその独自行クラスを使用します。