2010年2月3日水曜日

Zend_Db_Table(その5) 検索その2

find()メソッドでは、主キーのみにしか条件に設定できないため、他の条件を指定する場合は、fetchAll()メソッドやfetchRow()メソッドで、Zend_Db_Table_Selectクラスを指定する。

Zend_Db_Table_Selectクラスは、テーブルクラスのselect()メソッドを使うと取得できる。

(コード例)
$table=new Hoge();

$select=$table->select();

Zend_Db_Table_Selectクラスに対して、条件を設定する。
SQLで記述するところを
 from() : テーブル名や取得する項目を指定する。
 where():検索条件をANDで指定する。
 orwhere() :検索条件をORで指定する。
 order() :ソート順を指定する
 limit():取得件数を制限する


(コード例)
$table=new Hoge();
$select=$table->select();
//テーブルからidとnameを取得対象とする
%select->from($table->name(),array("id","name");
//id項目に制限を追加
$select->where("id>?", 100);
//name項目に制限を追加(OR)
$select->orwhere("name like ?","%hoge%");
//sort順をidの降順に設定
$select->order("id DESC");
//取得するレコードを11番目から100行取得
$select->limit(100,10);
//検索実行
$rows=$table->fetchAll($select);

Zend_Db_Table_Selectへの条件を指定する順番は意識しなくてもいい。
where()などの戻り値はZend_Db_Table_Selectオブジェクトになるので、以下のような記述もできる。

(コード例)
$table=new Hoge();
$table->fetchAll($select=$table->select()->where("id>?",100)->orwhere("name like"."%hoge%")->limit(100,10)->order("id DESC"));

※2行目は区切りなしで記述している。


他のテーブルとの結合(join)もできる。

(コード例)
$table=new Hoge();
$select=$table->select()->from()->setIntegrityCheck(false)->join("テーブル名","テーブル名.id=hoge.id",array())->where("id>?",100);

leftjoin()メソッドやrightjoin()メソッドを使うと、外部結合の指定も可能。
他のテーブルを結合する場合、取得する項目に他のテーブルの項目を混ぜることができ、joinメソッドの3つ目の引数で指定する。
その場合、setIntegrityCheck(false)としておかないと、例外がスローされる。

他のテーブルの項目を混在して取得したZend_Db_Table_Rowに対してはupdateメソッドを使った更新を行うことができずに例外がスローされる。

0 件のコメント: