Programmer's Reference Guide
| Zend_Db_Table |
Zend_Db_Table_Row
導入
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 型のオブジェクトを返します。
例1 行の取得の例
$bugs = new Bugs();
$row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
Zend_Db_Table_Rowset オブジェクトには、複数の Zend_Db_Table_Row オブジェクトが含まれます。 Zend_Db_Table_Rowset を参照ください。
例2 行セット内の行を読み込む例
$bugs = new Bugs();
$rowset = $bugs->fetchAll($bugs->select()->where('bug_status = ?', 1));
$row = $rowset->current();
行からのカラムの値の読み込み
Zend_Db_Table_Row_Abstract にはアクセサがあり、 行のカラムをオブジェクトのプロパティとして参照できます。
例3 行からカラムを読み込む例
$bugs = new Bugs();
$row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
// bug_description カラムの値を出力します
echo $row->bug_description;
注意: 初期のバージョンの Zend_Db_Table_Row では、 これらのアクセサをデータベースのカラムと対応させる際に inflection (変形) と呼ばれる文字列変換を行っていました。
現在の Zend_Db_Table_Row では変形を実装していません。 使用するアクセサ名は、データベース内のカラム名と正確に一致します。
行データの配列としての取得
行のデータに対して配列としてアクセスするには、行オブジェクトの
toArray() メソッドを使用します。
これは、カラム名とその値を関連付けた連想配列を返します。
例4 toArray() メソッドの使用例
$bugs = new Bugs();
$row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
// 行オブジェクトから カラム名/値 の連想配列を取得します
$rowArray = $row->toArray();
// 通常の配列と同様に使用します
foreach ($rowArray as $column => $value) {
echo "カラム: $column\n";
echo "値: $value\n";
}
toArray() が返す配列は、更新できません。
配列内の値を変更することは可能ですが、
それをデータベースに保存することはできません。
関連するテーブルからのデータの取得
Zend_Db_Table_Row_Abstract クラスには、関連するテーブルから 行や行セットを取得するメソッドが存在します。 テーブルのリレーションについての詳細な情報は 導入 を参照ください。
データベースへの行の書き込み
行のカラムの値の変更
個々のカラムの値をアクセサで設定する方法は、 カラムを読み込む場合と同様で、オブジェクトのプロパティを使用します。
カラムのアクセサによる値の設定は、アプリケーション内の行データのカラムの値は変更しますが、
それだけではまだデータベースにコミットされていません。コミットするには
save() メソッドを使用します。
例5 行のカラムの内容を変更する例
$bugs = new Bugs();
$row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
// ひとつあるいは複数のカラムの値を変更します
$row->bug_status = 'FIXED';
// データベース内の行を、新しい値で UPDATE します
$row->save();
新しい行の挿入
指定したテーブルに新しい行を作成するには、テーブルクラスの
createRow() メソッドを使用します。
取得した行のフィールドに対してはオブジェクト指向のインターフェイスでアクセスできますが、
save() メソッドをコールするまでは
実際にデータベースの内容が変更されることはありません。
例6 テーブルに新しい行を作成する例
$bugs = new Bugs();
$newRow = $bugs->createRow();
// アプリケーションに応じて適切にカラムの値を設定します
$newRow->bug_description = '...説明...';
$newRow->bug_status = 'NEW';
// 新しい行をデータベースに INSERT します
$newRow->save();
createRow() メソッドのオプションの引数として、連想配列を渡すことができます。 この連想配列では、新しい行のフィールドに代入する値を指定します。
例7 テーブルに新しい行を作成し、値を代入する例
$data = array(
'bug_description' => '...説明...',
'bug_status' => 'NEW'
);
$bugs = new Bugs();
$newRow = $bugs->createRow($data);
// 新しい行をデータベースに INSERT します
$newRow->save();
注意: Zend_Db_Table の初期のリリースでは、
createRow()メソッドはfetchNew()という名前でした。 今後は新しい名前を用いることを推奨しますが、 過去との互換性を確保するため古い名前も使用できるようになっています。
複数のカラムの値の変更
Zend_Db_Table_Row_Abstract の
setFromArray() メソッドを使用すると、
ひとつの行の複数のカラムを一度に設定することができます。
このメソッドには、カラム名と値を関連付けた連想配列を指定します。
このメソッドは、新しい行の値を設定する場合や
既存の行を更新する場合のどちらでも有用でしょう。
例8 setFromArray() で新しい行の値を設定する例
$bugs = new Bugs();
$newRow = $bugs->createRow();
// データを連想配列形式にします
$data = array(
'bug_description' => '...説明...',
'bug_status' => 'NEW'
);
// すべてのカラムの値を一度に設定します
$newRow->setFromArray($data);
// 新しい行をデータベースに INSERT します
$newRow->save();
行の削除
行オブジェクトで delete() メソッドをコールすることができます。
これは、その行オブジェクトの主キーに対応するデータベースの行を削除します。
例9 行の削除の例
$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');
// この行を DELETE します
$row->delete();
変更を適用するのに save() をコールする必要はありません。
これは、データベースに対して即時に適用されます。
行のシリアライズと復元
データベースの行の内容を保存しておき、 あとで使用するということはよくありがちです。 オブジェクトの内容を、オフラインで保存しやすい形式 (たとえばファイルなど) に変換するような処理のことを シリアライズ といいます。 Zend_Db_Table_Row_Abstract 型のオブジェクトは、 シリアライズをすることができます。
行のシリアライズ
PHP の serialize() 関数を使用して、
行オブジェクトのバイトストリームを含む文字列を作成します。
例10 行のシリアライズの例
$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');
// オブジェクトをシリアライズします
$serializedRow = serialize($row);
// これで、$serializedRow をファイルなどに書き出すことができます
</programlisting>
</example>
</sect3>
<sect3 id="zend.db.table.row.serialize.unserializing">
<title>シリアライズした行データの復元</title>
<para>
PHP の <code>unserialize()</code> 関数を使用して、
オブジェクトのバイトストリームを含む文字列を復元します。
この関数は、もとのオブジェクトを返します。
</para>
<para>
返された行オブジェクトは、
<emphasis>接続が切断された</emphasis> 状態であることに注意しましょう。
行オブジェクトやそのプロパティを読み込むことはできますが、
その値を変更することはできません。また、データベース接続を必要とするようなメソッド
(たとえば従属テーブルに対するクエリなど) も実行できません。
</para>
<example id="zend.db.table.row.serialize.unserializing.example">
<title>シリアライズした行の復元の例</title>
<programlisting role="php"><