CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
2017/03/12
Search Pluginで検索処理 設置方法 その5
Search Pluginで検索処理 AND検索、OR検索のサンプルコード
今回の検索は、入力項目に複数のキーワードを入力した際に、AND検索したり、OR検索したりする検索方法です。
今回の処理は、「CakePHP 2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法」をベースにしていますので、そちらもご覧ください。
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?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' => ','), ); : : } |
————–
Search Pluginで検索処理 AND検索、OR検索の注意点
上記の方法は、検索対象が部分一致検索(’type’ => ‘like’)の場合のみ有効です。
完全一致検索(’type’ => ‘value’)の場合は、下記の様に「connectorAnd」「connectorOr」を設定してもエラーにはなりませんが、正しい検索結果は戻ってきません。
————–(/app/Model/User.php)
1 2 3 4 5 6 7 8 |
<?php class User extends AppModel { : : array('name' => 'id', 'type' => 'value', 'field' => 'User.id', 'connectorAnd' => ' ', 'connectorOr' => ','), : : } |
————–
私は、このことが分からず、かなーりハマりました。エラーが起こらないために何が悪いのかが分かりにくいんですよね。
Search Pluginで検索処理 AND検索、OR検索の処理のポイント
ではどうするか。
下記の様に「’type’ => ‘subquery’」を設定し、「searchIn」の関数を設定し、queryに編集する文字列を生成します。
subqueryを設定し、入力値を戻すだけで IN句を生成してくれるようです。
————–(/app/Model/User.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?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)
1 2 3 4 5 6 7 |
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; } |
————–
Search Pluginで検索処理 AND検索、OR検索の応用編
その他、これを応用して、例えば、必ず表示させる情報がある場合の対応も可能です。
具体的なイメージとしては、会員サイトで会員ごとにお知らせを配信しているとします。
通常は、会員ごとに配信するので会員 IDを付与してお知らせを配信しますが、全会員に向けて一斉配信したいお知らせがあった場合に、特定の IDを付与したお知らせはすべての会員に配信したい、そんな状況を想定します。
処理の方法は、「$data[‘id’] .= ‘,20’;」の行を追加するだけです。
今回は、サンプルとして「20」の IDは必ず表示させるようにしていますが、IDを 0にするといった方法でもいいと思います。(もっとスマートな書き方もありますが...)
————–(/app/Model/User.php)
1 2 3 4 5 6 7 8 |
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; } |
————–
【CakePHP 2.3 Search Plugin検索処理 目次】
CakePHP 2.3 Search Pluginで検索処理 その1設置方法
CakePHP 2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP 2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でCSVファイルをアップロードしレコードを追加、更新する処理の作成方法の解説。モデルとは直接関連しないフォームからCSVファイルをアップロードするため汎用的に使用可能。
-
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。
-
-
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
responseの値を指定する方法は3系では「body」だが、4系では「withStringBody」になりる。加えてJSON形式なら「withType」で指定するなど4系では結構異なる処理がある。
-
-
CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。
-
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
-
CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)
CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。
-
-
CakePHP3、CakePHP4、CakePHP5のバージョンを指定してインストールする詳細な手順を解説
CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。
-
-
CakePHP 2.3でファイルのアップロード処理を作る
CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。
-
-
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。
-
-
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。