CakePHPの複数OR検索は連想配列を追加という提案 ITかあさん

ITかあさん

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');

こんな風に書いてしまうことも出来ますね。

複雑な検索フォームからの条件検索ではけっこう使えますよん。

初夏のJavaScript祭 in サーキュレーションビル ForPro