Posted on

Cakeのpaginatorのソートを押して複数条件のソートを行う方法

あるシステムで日報の1日の予定を登録して頂いていて、
日付単位とその中の詳細の予定の2段階でのソートをする必要がありました。
第一ソート条件は日付で第二ソート条件が詳細予定の時間というソートを実現させる実装方法です。

まずviewでpaginatorのソートの記述を書きます。
Paginator->sort(‘report_date’, ‘訪問日時’); ?>

次にコントローラーで次のように書きます。

if (empty($this->passedArgs['sort'])) {
    $order = array('Report.report_date' => 'desc', 'Report.staff_id' => 'asc', 'ReportDetail.report_date' => 'asc');
}elseif ($this->passedArgs['sort'] == 'report_date'){
    $order = array('Report.report_date' => $this->passedArgs['direction'], 'Report.staff_id' => 'asc', 'ReportDetail.report_date' => 'asc');
}
$this->ReportDetail->setOrder($order);

最後にモデルで次のように書きます。

// デフォルトのソート条件は何もなし
var $order = array();

function setOrder($order) {
	// controllerから渡された$orderを変数に持っておく
	$this->order = $order;
}

function beforeFind($queryData) {
	// 実行中のfindの種別が'count'以外だった場合のみ、
	// ソート条件を追加し、$orderを初期化する
	if ($this->findQueryType != 'count' ) {
		array_unshift($queryData['order'], $this->order);
		$this->order = array();
	}
	return $queryData;
}

これでCakeのpaginatorのソートを押して複数条件のソートが行えました。
作成するに当たり下記サイトを参考にさせて頂きました。
http://d.hatena.ne.jp/atcorp/20100213/p1