でも、一応メモ。
だめだ。やっぱり、 find を拡張するべきだな。
beforeFindは使いづらい。
概要と流れ
[概要]データを検索するときにグーグルアドワーズ風な
0 => '全期間',
1 => '今日',
2 => '昨日',
3 => '今週',
4 => '先週',
5 => '先月',
6 => '過去30日間',
7 => '全期間'
で、データを絞り込む。
・hasMany対応。
・beforeFindするときに一括でfindを設定するのでいちいち設定する必要無し。
○ビヘイビア
<?php
/*
グーグルアドワーズみたいに
0 => '全期間',
1 => '今日',
2 => '昨日',
3 => '今週',
4 => '先週',
5 => '先月',
6 => '過去30日間',
7 => '全期間'
の日付でデータを絞り込めるビヘイビア
日曜日 → 土曜日まで
*/
class SqlDateBehavior extends ModelBehavior
{
var $sqlDate = 0;
var $config = array(
'field_name' => 'created'//cretedフィールドの名前
);
var $days = array(
0 => '全期間',
1 => '今日',
2 => '昨日',
3 => '今週',
4 => '先週',
5 => '今月',
6 => '先月',
7 => '過去30日間'
);
function setup(&$model, $config = array())
{
$this->config = array_merge($this->config, $config);
}
/*
日付リストを一覧で返す
@return array 日付のリスト
*/
function getDateList(&$model)
{
return $this->days;
}
/*
指定された日付毎のcretedSQLを作成
@params int $days_key daysのキー
@return 0 (全期間以外は)created のSQLを返す
*/
function getDaysSql(&$model,$days_key = 0)
{
App::import('Helper', 'Time');
$time = new TimeHelper();
$q = false;
switch($days_key){
case 0:
//全期間
break;
case 1:
//今日
$q = $time->dayAsSql(date('Y-m-d'),$this->config['field_name']);
break;
case 2:
//昨日
$q = $time->dayAsSql(date('Y-m-d',strtotime("-1 day")),$this->config['field_name']);
break;
case 3:
//今週
$this_week[0] = date('Y-m-d',strtotime("last Sunday"));
$this_week[1] = date('Y-m-d',strtotime("Saturday"));
$q = $time->daysAsSql($this_week[0],$this_week[1],$this->config['field_name']);
break;
case 4:
//先週
$last_week[0] = strtotime("last Sunday")-604800;//-7日分
$last_week[0] = date('Y-m-d',$last_week[0]);
$last_week[1] = strtotime("Saturday")-604800;//-7日分
$last_week[1] = date('Y-m-d',$last_week[1]);
$q = $time->daysAsSql($last_week[0],$last_week[1],$this->config['field_name']);
break;
case 5:
//今月
$this_month[0] = date('Y-m-01');
$this_month[1] = date(DATE_W3C, mktime(0, 0, 0, date('m')+1, 0, date('y')));
$q = $time->daysAsSql($this_month[0],$this_month[1],$this->config['field_name']);
break;
case 6:
//先月
$last_month[0] = date('Y-m-01',strtotime('-1 month'));
$last_month[1] = date(DATE_W3C, mktime(0, 0, 0, date('m'), 0, date('y')));
$q = $time->daysAsSql($last_month[0],$last_month[1],$this->config['field_name']);
break;
case 7:
//過去30日
$last_month[0] = date('Y-m-d',strtotime('-30 day'));
$last_month[1] = date('Y-m-d');
$q = $time->daysAsSql($last_month[0],$last_month[1],$this->config['field_name']);
break;
}
return $q;
}
}
?>
使い方サンプル
○モデル
使いたいモデルで読み込み
var $actsAs = array(
'Sqldate' => array(
'config' => array('field_name' => 'created')//createdフィールドの名前
)
);
//日付指定されていれば日付を指定してデータを取得
//今回は User モデルに PayモデルがhasManyされている場合で、Payモデルの日付を制限したいとき
function beforeFind($q)
{
if($this->sqlDate != 0){
$this->hasMany['Pay']['conditions'][] = $this->getDaysSql($this->sqlDate);//createdクエリが返る
}
return $q;
}
○コントローラー
//このdayskeyに 今日、明日などのキーを渡しとく
function mypage($days_key = 0)
{
//日付リストを取得
$days_list = $this->M->getDateList();
//月別ならこのメソッドで月別に見られるようにするか。
$this->M->sqlDate = $days_key;//日付絞り込みキーを渡す
$res = $this->M->find('all');
}
○ビュー
<?
//コントローラーに渡す days_key のリストを作成
foreach($days_list as $key => $v){
echo '<a href="/users/mypage/'.$key.'/">'.$v.'</a><br />';
}
?>
こんな感じ。
sqldateビヘイビアはただ単に指定した日付に応じた cretedの範囲を返すだけ。
もっとシンプルに作れたら良かったけどなぁ。。。



