CakePHPの複数OR検索は連想配列を追加という提案
CakePHPの複数のOR検索は連想配列を追加するというご提案
SQLのWHEREにあたる部分はCakePHPのconditionsですが、この条件が
条件がたくさんあるとごっちゃごちゃになって分かり難い!
超複雑なconditionsの例
以下はcakephpのcookbookからの引用です。こちら
前半のORはよいとして、後半のANDはORとNOTの条件両方を満たすもの、ですね。
$conditions = array( 'OR' => array( array('Company.name' => 'Future Holdings'), array('Company.city' => 'CA') ), 'AND' => array( array( 'OR'=>array( array('Company.status' => 'active'), 'NOT'=>array( array('Company.status'=> array('inactive', 'suspended')) ) ) ) ) );
これをどう…理解しろとっ!!
条件にorとかnotとか含まれると、もうね、訳わかんない。ここまで来るとSQL直接書いたほうがよっぽどいいんでないの?と。
Cakeを主食のかあさんも、この超複雑な配列構造には頭を悩ませてました。
複雑な条件の時は、連想配列として代入していけばいいよ!
例えば、先ほどの前半のORも十分分かり難いですが、
$conditionsという配列に、連想配列を追加してゆくという考え
をすると、だいぶすっきりまとめることが出来るじゃないか、と気がつきました
$conditions = array();//配列を追加してゆく考えなので、先に空の配列を代入 //ORの条件 $city_con = array( array('Company.name' => 'Future Holdings'), array('Company.city' => 'CA') ); $conditions[]['or'] = $city_con; //2つの条件がまっちした時だけのAND $conditions[]['AND'][]['or'] = array('Company.status' => 'active'); $conditions[]['AND'][]['NOT'] = array('Company.status' => 'active');
空の[] が無いと、常に上書きになってしまうので注意が必要
さらに各条件が後から追加された場合(後半の複雑なAND検索)、
以下のようにしてもいいんですが、
//2つの条件がまっちした時だけのAND $conditions[]['AND'][]['or'] = array('Company.status' => 'active','Company.area' => 5); $conditions[]['AND'][]['NOT'] = array('Company.status' => 'active','Company.hoge' => 'hoge');
array_push(配列の末尾に配列を追加)するみたく、
//2つの条件がまっちした時だけのAND $conditions[]['AND'][]['or'][] = array('Company.area' => 5); $conditions[]['AND'][]['NOT'][] = array('Company.hoge' => 'hoge');
こんな風に書いてしまうことも出来ますね。
複雑な検索フォームからの条件検索ではけっこう使えますよん。