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 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

[プログラミング][CakePHP]find()で条件指定(order byとwhere)
Excerpt: CakePHPのfind()でorder byとwhereの使い方が分からなかったので、メモ。 find( ’all’, array( ’order’ => array(’Item.item..
Weblog: へっぽこ社内SE taramoneraの日記
Tracked: 2010-03-02 22:03