日記
Zend_Db_Tableの使い勝手の向上Edit

Zend_Db_Tableの使い勝手が良くないんで、独自にjoin対応してみたりもしたんだけど、やっぱりああやって元クラス自体に手を入れなきゃならないアプローチは実用レベルにはなり得ないよなーということで、別アプローチでZend_Db_Table周りを使いやすくしてみた。

ソースを見れば分かるけど、要はZend_Db_Table、Zend_Db_Table_Row、Zend_Db_Table_Rowsetのインスタンスをコンポジットに持つ集約クラスを作って、状況に応じて妥当な内部クラスのメソッドを呼ぶ、というのが基本的な構造。

で、それに加えて、Zend_Db_Tableでは扱えない複数テーブルにまたがったデータのハンドリングを行いやすくするための、拡張カラムの呼び出し機能を追加してある。

Zend_Db_Tableで処理を書こうとすると、

class Foo extends Zend_Db_Table{}
$table = new Foo();
$rowset = $table->fetchAll();
foreach ($rowset as $row) {
echo $row->id;
}
$row = $table->find(1);
echo $row->id;

みたいな感じで、Table、Row、Rowsetオブジェクトがいちいち発生してうざかった。それを、

class Foo extends Zend_Db_Table{}
$table = new WEBXP_Db_Object(new Foo());
$table->fetchAll();
foreach ($table as $row) {
echo $row->id;
}
$table->find(1);
echo $table->id;

みたいな感じで、一つのオブジェクトで完結して処理が書けるようになる。

あと、fooテーブルがbar_idカラムでbarテーブルとリンクするような構造だった場合、

$table->fetchAll();
foreach ($table as $row) {
$bar = $row->bar; // $row->barIdから自動的にbarテーブルオブジェクトを取得
}

といった感じで、規約通りのテーブル構成だった場合は、プロパティ名から自動的にリンクするテーブルのオブジェクトを取得してくれる。

あと、拡張カラム名とその内容を取得するためのselect文を定義しておけば、規約外の構造でリンクされる他テーブルの情報を、プロパティとして取得できるような機能を追加してある。

といったあたりまで拡張したら、Zend_Db_Tableもずいぶん使い物になるんじゃなかろうか。今後互換性のない機能拡張がないことを祈りつつ、このアプローチをしばらく試してみよう。

Published At2006-05-22 00:00Updated At2006-05-22 00:00