https://github.com/CakeDC/search
の Search Pluginの説明を見ると、 orConditions() のようなメソッドを自分で書くと、「同じキーワードで複数フィールドを検索できちゃったりするよ」と書いてあります。
モデル.php の中に、
public $filterArgs = array(
'filter' => array('type' => 'query', 'method' => 'orConditions'),
);
とか書いて、
public function orConditions($data = array()) {
$filter = $data['filter'];
$cond = array(
'OR' => array(
$this->alias . '.title LIKE' => '%' . $filter . '%',
$this->alias . '.body LIKE' => '%' . $filter . '%',
));
return $cond;
}
というコードに誘導してやれば、titleフィールドとbodyフィールドを両方検索できちゃいますよ、と。
でもこれをそのまま素直に使うと、検索項目が複数あるときに問題になってしまいます。
せっかくサンプルの標準状態では、
SQLのクエリが、
~~~ WHERE モデル.フィールドA='A' AND モデル.フィールドB='B' AND モデル.フィールドC='C'
のように絞り込みになっているのに、上記をそのままつっこむと、
~~~ WHERE モデル.フィールドA='A' OR モデル.title='B' OR モデル.body='B' AND モデル.フィールドC='C'
とかになってしまうんです。
これは使えない!
で、これの解決策ですが、ちょっと考えると思いつきます。
下記のように"きちんと"設定しましょう。
public function orConditions($data = array()) {
$filter = $data['filter'];
$cond = array(
'AND'=>array(
'OR' => array(
$this->alias . '.title LIKE' => '%' . $filter . '%',
$this->alias . '.body LIKE' => '%' . $filter . '%',
)
));
return $cond;
}
こうするだけで、
~~~ WHERE モデル.フィールドA='A' AND (モデル.title='B' OR モデル.body='B') AND モデル.フィールドC='C'
というSQLになります。