最近、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あたりに共通化しておこう。