User モデルで find type メソッドをカスタマイズしました。
protected function _findStats($state, $query, $results = array()) {
if ($state === 'before') {
debug($query);
$query['fields'] = array('User.id', 'User.username', 'Click.clicks', 'Click.unique', 'Sale.sales_1', 'Sale.sales_2');
$query['joins'] = array(
array(
'table' => '(' . $this->__buildSubQueryClicks() . ')',
'alias' => 'Click',
'type' => 'LEFT',
'conditions' => array('User.id = Click.id')
),
array(
'table' => '(' . $this->__buildSubQuerySales() . ')',
'alias' => 'Sale',
'type' => 'LEFT',
'conditions' => array('User.id = Sale.id')
)
);
return $query;
}
return $results;
}
今、他のコントローラー (という名前ReportsController
) から、この検索の結果をページ分割したいと思います。私はこのようにやっています:
public function admin_index() {
list($from, $to) = $this->_prepareCommonVariables();
$this->paginate = array('stats');
$this->User->recursive = 0;
$this->set('users', $this->paginate('User',
array(
'Click.created BETWEEN ? AND ?' => array($from, $to),
'Sale.sold BETWEEN ? AND ?' => array($from, $to)
),
array('User.username', 'Click.unique', 'Click.clicks', 'Sale.sales_1', 'Sale.sales_2')
));
}
User.id
問題は、User.username
フィールド (通常はユーザー フィールド) でしか注文できないことです。許可されたフィールドを 3 番目のパラメーターで指定しController::paginate()
ても機能しません。Paginator Helper
リンクは適切な URL (例: ) を生成し/admin/reports/index/sort:Click.clicks/direction:asc
ますが、SQL クエリに ORDER BY 部分が表示されません。たとえば、フィールドが空である場合は、入力し debug($query)
ました。_findStats()
Click.clicks
$query['order']