2014年01月29日

Search Pluginで、orConditions() みたいなのを使いながら同時に絞り込む

ついでにもうひとつ書いておきます。

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になります。






posted by SDozono at 17:17| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

この記事へのトラックバック
手(パー)To make a comment: Please type your name and comment. at the validation field box, type 'cakephp'. And there two glay buttons. "Preview"/"Submit". Thank you!