トップ «前の日記(2006-04-06) 最新 次の日記(2006-04-08)» 編集

2002|01|02|03|04|05|06|07|08|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|02|03|04|07|

2006-04-07 [長年日記]

_ Zend_Db_Tableのプロパティ形式検索条件対応

join機能の独自拡張」の続き。Zend_Db_Tableの使い勝手をもっとDB_DataObjectに近づけてみるべく、今度はプロパティ形式で検索条件を追加する機能をつけてみた。

使い方としては、

$productTable = new Product();
$productTable->name = 'foo'; // where name = 'foo'
$productTable->amount = 32; // and amount = 32
$products = $productTable->fetchAll('id > 3');
// select * from product where id > 3 and name = 'foo' and amount = 32

な感じ。一度セットした条件をクリアしたい場合は、テーブルオブジェクトを作り直すか、あるいは、

$productTable->name = null; nullをセットする
$productTable->clearFields('name'); //カラム名を指定してクリア
$productTable->clearFields(); //すべてのカラム条件をクリア

とする。前回追加したjoinメソッドとも同時に使うことができるけれども、joinされた側のカラム条件は反映されないんで、

$productTable->name = 'foo';
$stockTable->amount = 0;
$productTable->join($stockTable);
$products = $productTable->fetchAll();

としても、

select product.* from product inner join stock on product.id = stock.product_id where product.name = 'foo' and stock.amount = 0;

とはなってくれない。そうしたい場合は、

$productTable->name = 'foo';
$productTable->join($stockTable);
$products = $productTable->fetchAll('stock.amount = 0');

とする必要がある。

まあZend_Db_Table::_fetchの中でjoin条件を展開するときに、joinされる側のオブジェクトから検索条件を持ってくるようにすれば、この辺も対応できるんだけど、内部で使用するSQL文を、publicなメソッド経由で外部オブジェクトから取得するのってなんかいまいちかなーとか思って、書いてない。