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 型のオブジェクトを返します。 Example #1 行の取得の例
Zend_Db_Table_Rowset オブジェクトには、複数の Zend_Db_Table_Row オブジェクトが含まれます。 詳細については table rowset についての章を参照ください。 Example #2 行セット内の行を読み込む例
行からのカラムの値の読み込みZend_Db_Table_Row_Abstract にはアクセサがあり、 行のカラムをオブジェクトのプロパティとして参照できます。 Example #3 行からカラムを読み込む例
行データの配列としての取得行のデータに対して配列としてアクセスするには、行オブジェクトの toArray() メソッドを使用します。 これは、カラム名とその値を関連付けた連想配列を返します。 Example #4 toArray() メソッドの使用例
toArray() が返す配列は、更新できません。 配列内の値を変更することは可能ですが、 それをデータベースに保存することはできません。 関連するテーブルからのデータの取得Zend_Db_Table_Row_Abstract クラスには、関連するテーブルから 行や行セットを取得するメソッドが存在します。 テーブルのリレーションについての詳細な情報は リレーションシップ を参照ください。 データベースへの行の書き込み行のカラムの値の変更個々のカラムの値をアクセサで設定する方法は、 カラムを読み込む場合と同様で、オブジェクトのプロパティを使用します。 カラムのアクセサによる値の設定は、アプリケーション内の行データのカラムの値は変更しますが、 それだけではまだデータベースにコミットされていません。コミットするには save() メソッドを使用します。 Example #5 行のカラムの内容を変更する例
新しい行の挿入指定したテーブルに新しい行を作成するには、テーブルクラスの createRow() メソッドを使用します。 取得した行のフィールドに対してはオブジェクト指向のインターフェイスでアクセスできますが、 save() メソッドをコールするまでは 実際にデータベースの内容が変更されることはありません。 Example #6 テーブルに新しい行を作成する例
createRow() メソッドのオプションの引数として、連想配列を渡すことができます。 この連想配列では、新しい行のフィールドに代入する値を指定します。 Example #7 テーブルに新しい行を作成し、値を代入する例
複数のカラムの値の変更Zend_Db_Table_Row_Abstract の setFromArray() メソッドを使用すると、 ひとつの行の複数のカラムを一度に設定できます。 このメソッドには、カラム名と値を関連付けた連想配列を指定します。 このメソッドは、新しい行の値を設定する場合や 既存の行を更新する場合のどちらでも有用でしょう。 Example #8 setFromArray() で新しい行の値を設定する例
行の削除行オブジェクトで delete() メソッドをコールできます。 これは、その行オブジェクトの主キーに対応するデータベースの行を削除します。 Example #9 行の削除の例
変更を適用するのに save() をコールする必要はありません。 これは、データベースに対して即時に適用されます。 行のシリアライズと復元データベースの行の内容を保存しておき、 あとで使用するということはよくありがちです。 オブジェクトの内容を、オフラインで保存しやすい形式 (たとえばファイルなど) に変換するような処理のことを シリアライズ といいます。 Zend_Db_Table_Row_Abstract 型のオブジェクトは、 シリアライズできます。 行のシリアライズPHP の serialize() 関数を使用して、 行オブジェクトのバイトストリームを含む文字列を作成します。 Example #10 行のシリアライズの例
シリアライズした行データの復元PHP の unserialize() 関数を使用して、 オブジェクトのバイトストリームを含む文字列を復元します。 この関数は、もとのオブジェクトを返します。 返された行オブジェクトは、 接続が切断された 状態であることに注意しましょう。 行オブジェクトやそのプロパティを読み込むことはできますが、 その値を変更することはできません。また、データベース接続を必要とするようなメソッド (たとえば従属テーブルに対するクエリなど) も実行できません。 Example #11 シリアライズした行の復元の例
生きたデータとしての行の復活切断された行の接続を復活させるには、 setTable() メソッドを使用します。このメソッドへの引数としては、 Zend_Db_Table_Abstract 型のオブジェクトを作成して渡します。 テーブルオブジェクトを作成するには、データベースとの接続が必要です。 そのテーブルと行を関連付けることで、行がデータベースにアクセスできるようになります。 それ以降は、行オブジェクトの値を変更してデータベースに保存できるようになります。 Example #12 行の復活の例
行クラスの拡張Zend_Db_Table_Row は、Zend_Db_Table_Row_Abstract を継承したデフォルトの具象クラスです。 Zend_Db_Table_Row_Abstract を継承した具象クラスを新たに作成し、 それを用いて行のインスタンスを作成できます。 独自の行クラスを指定するには、テーブルクラスの protected メンバである $_rowClass を使用するか、 テーブルオブジェクトのコンストラクタの引数の配列で指定します。 Example #13 独自の行クラスの指定
行の初期化行を作成する際にアプリケーション固有のロジックを初期化したい場合は、 その作業を init() メソッドに移動します。 このメソッドは、行のメタデータの処理がすべて終わった後にコールされます。 メタデータを変更するつもりがないのなら、 __construct() メソッドを使うよりもこちらのほうを推奨します。 Example #14 init() メソッドの使用例 Zend_Db_Table_Row における Insert、Update および Delete の独自ロジックの定義行クラスは、INSERT や UPDATE、 DELETE の操作の前に、対応する protected メソッド _insert()、 _update() および _delete() をコールします。 行クラスのサブクラスで、これらのメソッドに独自ロジックを追加できます。 特定のテーブルに対して独自のロジックを必要とし、 それがそのテーブル上のすべての操作に対して発生するのなら、 その処理はテーブルクラスの insert()、 update() および delete() で実装したほうがよいでしょう。 しかし、独自のロジックを行クラスで実装したほうがよい場合もあります。 独自ロジックの実装を テーブルクラスよりも行クラスで行ったほうがよい例を、 以下にいくつか示します。 Example #15 行クラスでの独自ロジックの例 独自ロジックが、そのテーブルのすべての操作に適用されるとは限りません。 状況に応じて独自ロジックを適用するには、 そのロジックを行クラスで実装し、 その行クラスを指定してテーブルクラスのインスタンスを作成します。 指定しなければ、テーブルクラスはデフォルトの行クラスを使用します。 このテーブルでは、データに対する操作内容を Zend_Log オブジェクトに記録する必要があります。 ただし、それはアプリケーションの設定でログ記録を有効にしている場合のみとします。
Example #16 挿入するデータの記録を複数のテーブルで行う行クラスの例 複数のテーブルで、共通の独自ロジックを使用することもあるでしょう。 同じロジックをすべてのテーブルクラスで実装するのではなく、 その場合はその動作を行クラスで定義しましょう。 そして各テーブルでその行クラスを使用するのです。 この例では、ログ記録用のコードは全テーブルクラスで同一です。
Zend_Db_Table_Row における変形の定義テーブルのクラス名を RDBMS のテーブル名とあわせるために、 inflection (変形) と呼ばれる文字列変換を使用することを好む方もいます。 Zend_Db クラス群は、デフォルトでは変形をサポートしていません。 この方針については 語尾変化の拡張 で説明します。 変形をさせたい場合は、変換処理を自前で実装する必要があります。そのためには、 独自の行クラスで _transformColumn() メソッドをオーバーライドし、 テーブルクラスでクエリを実行する際にその独自行クラスを使用します。 Example #17 変換処理の定義例 これにより、カラム名を変形させたものでアクセスできるようになります。 行クラスの _transformColumn() メソッドを使用して、データベースのテーブル内のカラム名を変更しています。
変換関数を書くのはあなたの役割です。 Zend Framework では、そのような関数は用意していません。
|