ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  CakePHP 2.x >  CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索

今回の検索は、入力項目に複数のキーワードを入力した際に、AND検索したり、OR検索したりする検索方法です。
今回の処理は、その2(http://ssgiken.blog.fc2.com/blog-entry-31.html)をベースにしていますので、そちらもご覧ください。


CakePHPの Search Pluginでは、AND検索、OR検索の方法も簡単に実装できるように用意されています。
今回は、下記のように Modelの「nickname」に「'connectorAnd' => ' ', 'connectorOr' => ','」を追加することで、それぞれ AND検索、OR検索を実装しています。
AND検索の場合は「ー ン」の様に、OR検索の場合は「太郎,多恵子」の様に入力することでそれぞれ検索を行えます。

Googleの検索が半角スペースで区切ることで AND検索になりますので、「'connectorAnd' => ' '」としていますが、「' '(半角スペース)」と記述していある部分を好きな記号に変更することでオリジナルの区切り文字を設定することができます。

ただ、OR検索は、Googleの場合は「or」と入力することで OR検索になりますが、CakePHPのこの Search Pluginの場合は、区切り文字を 2文字以上のものを設定することができませんので、「'connectorOr' => ','」の方は「','(カンマ)」を設定しています。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname', 'connectorAnd' => ' ', 'connectorOr' => ','),
  );
    :
    :
}
--------------


上記の方法は、検索対象が部分一致検索('type' => 'like')の場合のみ有効です。

完全一致検索('type' => 'value')の場合は、下記の様に「connectorAnd」「connectorOr」を設定してもエラーにはなりませんが、正しい検索結果は戻ってきません。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id', 'connectorAnd' => ' ', 'connectorOr' => ','),
    :
    :
}
--------------

私は、このことが分からず、かなーりハマりました。エラーが起こらないために何が悪いのかが分かりにくいんですよね。

ではどうするか。
下記の様に「'type' => 'subquery'」を設定し、「searchIn」の関数を設定し、queryに編集する文字列を生成します。
subqueryを設定し、入力値を戻すだけで IN句を生成してくれるようです。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
    :
    :
  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'subquery', 'method' => 'searchIn', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );

  function searchIn($data = array()) {
    $query = $data['id'];
    return $query;
  }
    :
    :
}
--------------

ただ、この場合、「1,2,3」の様に「,(カンマ)」で区切らないとエラーになります。
そのため、もし、入力値が数字のみと分かっている場合は、「searchIn」の関数の中身を下記の様にしてみるのもいいでしょう。
1行目で数字以外を「,」に変換し、2行目でカンマが連続している場合はカンマ一つに変換する処理を入れて、3行目、4行目で先頭と最後尾のカンマを削除しています。
これであれば、数値以外が入力されても問題はないでしょう。

--------------(/app/Model/User.php)
  function searchIn($data = array()) {
    $query = mb_ereg_replace ( '[^0-9]', ',', $data['id'] );
    $query = mb_ereg_replace ( ',+', ',', $query );
    $query = mb_ereg_replace ( '^,', '', $query );
    $query = mb_ereg_replace ( ',$', '', $query );
    return $query;
  }
--------------



その他、これを応用して、例えば、必ず表示させる情報がある場合の対応も可能です。

具体的なイメージとしては、会員サイトで会員ごとにお知らせを配信しているとします。
通常は、会員ごとに配信するので会員 IDを付与してお知らせを配信しますが、全会員に向けて一斉配信したいお知らせがあった場合に、特定の IDを付与したお知らせはすべての会員に配信したい、そんな状況を想定します。

処理の方法は、「$data['id'] .= ',20';」の行を追加するだけです。
今回は、サンプルとして「20」の IDは必ず表示させるようにしていますが、IDを 0にするといった方法でもいいと思います。(もっとスマートな書き方もありますが...)

--------------(/app/Model/User.php)
  function searchIn($data = array()) {
    $data['id'] .= ',20';
    $query = mb_ereg_replace ( '[^0-9]', ',', $data['id'] );
    $query = mb_ereg_replace ( ',+', ',', $query );
    $query = mb_ereg_replace ( '^,', '', $query );
    $query = mb_ereg_replace ( ',$', '', $query );
    return $query;
  }
--------------


【CakePHP2.3 Search Plugin検索処理 目次】
CakePHP2.3 Search Pluginで検索処理 その1設置方法
CakePHP2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
関連記事
スポンサーサイト
[ 2013年08月26日 00:55 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。