2007年07月08日

モデルのcondition配列の展開(CakePHP)

久々に更新!!
最近、CakePHPを色々な案件で使用しているのだが、
メモしておかないと次探すのが面倒なので書く。

CakePHPでは、findAllメソッドなどの$conditionsに配列を渡せばwhere句を構築してくれる。

例えば、
$conditions = array('and' => array('Field.id = 3', 'or' => array('Field.id = 1', 'Field.id = 2')));


とした場合

WHERE (`Field`.`id` = 3) AND ((`Field`.`id` = 1) OR (`Field`.`id` = 2))


としてくれるので、自分でandでつないで次、orでつないでと文字列として作成するよりプログラムが組みやすい。

で、$model->queryでも$conditionsを配列として構築しておき、sqlを発行する直前にwhere句を構築したい。
(自前で作成してもよいのだが、修正を重ねるとwhere句の直後にandがきたりしてDBに怒られるのがうっとおしいので・・・)

CakePHPのソースを追っているとどうやら、DboSourceクラスのconditionsメソッドを呼び出せばよいというのがわかった。
(実際はconditionKeysToStringメソッドで行っている)

でコントローラクラスのアクションメソッド内で

$conditions = array('and' => array('Field.id = 3', 'or' => array('Field.id = 1', 'Field.id = 2')));
$db =& ConnectionManager::getDataSource($this->Model->useDbConfig);
$conditions = $db->conditions($conditions);


と書くことでうまくいった。
DataSourceを取得するのが面倒なので、AppModelあたりに共通化しておこう。



タグ:cakephp モデル
posted by asaton at 21:11| Comment(0) | TrackBack(1) | CakePHP | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。