ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  CakePHP 2.x >  CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索

スポンサーサイト

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

CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索

今回は、前方一致検索、後方一致検索、不等号による検索を行います。
今回の処理は、その2(http://ssgiken.blog.fc2.com/blog-entry-31.html)をベースにしていますので、そちらもご覧ください。

順番的にはもっと最初の方で提示するべき項目だと思いますが、これまでは「value」による完全一致検索、「like」による部分一致検索で処理を作ってきました。

ですが、この辺で改めて、完全一致検索、部分一致検索以外の検索の方法を書いておきます。

とはいえ、これについては、特に難しいものではありませんので、下記のサイトなどを見ていただくと分かるんじゃないかと思います。
http://mawatari.jp/archives/introduction-of-cakedc-search-plugin-for-cakephp



前方一致検索
「ユーザ名」の項目を前方一致検索する場合は、下記の通り「'before' => false, 'after' => true,」を追加します。Model以外の修正はありません。
--------------(/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',  'before' => false, 'after' => true, 'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );
    :
    :
}
--------------

後方一致検索
「ユーザ名」の項目を後方一致検索の場合は、下記の通り「'before' => true, 'after' => false,」を追加します。Model以外の修正はありません。
--------------(/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',  'before' => true, 'after' => false, 'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );
    :
    :
}
--------------


不等号による検索
「ユーザID」の項目を不等号によって検索をする場合は、下記の通り「id」を Modelと Viewのページにそれぞれ「id_from」「id_to」の項目変更しています。
不等号は「field」の項目の後ろに「>=」「<=」を記述します。

まぁ、今回は、すでにある項目を流用するため IDを不等号検索に使いましたが、実実装に関しては IDを from、toで検索することはないでしょうね。

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

  // 検索対象のフィールド設定
  public $presetVars = array(
    array('field' => 'id_from',  'type' => 'value'),
    array('field' => 'id_to',    'type' => 'value'),
    array('field' => 'username', 'type' => 'value'),
    array('field' => 'nickname', 'type' => 'value'),
    array('field' => 'limit',    'type' => 'value'),
  );
    :
    :
}
--------------

--------------(/app/View/Elements/searchForm.ctp)
    :
    :
    <dt><label>ユーザID</label></dt>  
    <dd><?php echo $this->Form->input('id_from', array(  
      'type' => 'text', 'div' => false, 'label' => false))?>  
        <?php echo $this->Form->input('id_to', array(  
      'type' => 'text', 'div' => false, 'label' => false))?></dd>  
    :
    :
--------------


続けて、between句による範囲指定の方法です。

不等号による範囲指定での検索は、betweenによる範囲検索より検索スピードが劣るとされています。
そのため、betweenによる範囲指定も探してみましたが、うまく実装することができませんでした...

現時点では、「/app/View/Elements/searchForm.ctp」は同じものを使います。
そして、Modelは、以下のように設定します。

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

  function idBetween($data = array()) {
    $query[] = $data['id_from'];
    if ( $data['id_to'] ) {
      $query[] = $data['id_to'];
    } else {
      $query[] = 999999;
    }
    return $query;
  }
    :
    :
}
--------------

「'type' => 'expression'」を設定し、「method」で配列を渡す関数を通すことで、自動的に「between句」を生成してくれます。
この方法でも、「id_from」に値が入力されれば正しく betweenで検索されます。

ですが、「id_from」の値が入っていない場合(「id_to」のみの入力の場合)は、入力がないものとして処理されません。


「id_to」のみの入力の場合も検索の処理をさせる方法については、分かりませんでした!!!
分かる方、どなたか教えてくださいっ!!


【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月19日 00:45 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)
コメントの投稿












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

プロフィール

エス技研

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

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
05 | 2017/06 | 07
- - - - 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 -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


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