ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  CakePHP 2.x >  CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

スポンサーサイト

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

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

今回は、「'type' => 'query'」を使い、オリジナルの検索条件を記述して検索する方法を行います。
今回の処理は、その2(http://ssgiken.blog.fc2.com/blog-entry-31.html)をベースにしていますので、そちらもご覧ください。


本当は、「Group By句」による集計の処理をやろうかと思っていましたが、Group By + sumによる集計は、集計した項目をバーチャルフィールド(virtual fields)を使って値を取得する必要があるため(バーチャルフィールドを使わなくても値を取得できないわけではないですが)、長くなりそうなので、「'type' => 'query'」の方を先にやってみたいと思います。


「'type' => 'query'」を使うと、検索の条件を柔軟性を持って設定することができるため、もともと用意されている検索方法以外の検索方法を行いたい、と思った場合に利用できる方法です。

具体的な検索方法を考える際にあれこれ悩みましたが、あまりいいサンプルを思いつかず、今回の記事は、下記のサイトを参考にさせていただきました。
http://kamakurasoft.net/blog/?p=1479


まずは、Viewから。
Viewの Elementsに下記の項目を追加してください。

--------------(/app/View/Elements/searchForm.ctp)
    :
    :
    <dt><label>日付</label></dt>  
    <dd><?php echo $this->Form->input('start',array(
        'type'=>'date', 'dateFormat'=>'YMD', 'timeFormat'=>'NONE', 'monthNames'=>'false',
//        'label'=>'開始年月日(年-月-日)',
        'label'=>'',
        'minYear'=>2010, 'maxYear'=>date('Y') + 5,
        'selected'=>array('year'=>date('Y')-1,'month'=>date('m'),'day'=>date('d')), /*1年前*/ )) ?></dd>
    :
    :
--------------

「'label'=>'開始年月日(年-月-日)',」をコメントにしていますが、labelの設定があると入力エリアのすぐ上にラベル表示がされるためにコメントにしています。
ちなみに、labelの設定がない場合は、デフォルトの設定として項目名の「start」がラベル名として表示されます。そのため、labelを消すためには「'label'=>'',」の設定が必要なようです。


続けて、Modelです。
サンプルは開始日と終了日での設定がしてありますが、ここでは面倒なので開始日しか設定していません。

日付の項目に関して、今回の日付項目は、「start」という項目名で設定しています。その中から、日付の「年」の項目は「$data['start']['year']」として取得します。同じように「月」「日」は、「$data['start']['month']」「$data['start']['day']」として取得します。

私は、最初のうちはこのことがよく分からず、日付の項目の項目名は一つなのに、年月日のそれぞれの項目はどうやって取得したらいいのだろう、としばーらく悩んでいました。
分かってしまえば意外に簡単ではあるんですが...

--------------(/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'),
    array('name' => 'start',    'type' => 'query', 'method'=>'createSql'),
  );

  public function createSql ( $data = array () ) {
    $start = $data['start']['year'] . '-' . $data['start']['month'] . '-' . $data['start']['day'];
    $condition = array ( 'DATE(User.created) >= DATE(?)' => array($start) );
    return $condition;
  }
    :
    :
}
--------------


また、入力の値を再び設定する処理で、下記のように設定してみましたがうまくいかず、デフォルトの設定に戻ってしまいます。
こちらの設定方法については後日分かり次第改めて対応したいと思います。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {
    :
    :
  // 検索対象のフィールド設定
  public $presetVars = array(
    :
    :
    array('field' => 'start',    'type' => 'date'),
  );
    :
    :
}
--------------

どなたかわかる方、教えてくださいっ!!


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












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

プロフィール

エス技研

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

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
04 | 2017/05 | 06
- 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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。