0

我目前在我的模型(参考模型)中有这个:

public function getReferers($type = 'today') {
    if ($type == 'this_month') {
        return $this->_getThisMonthsReferers();
    } elseif ($type == 'today') {
        return $this->_getTodaysPageReferers();
    }      
}

private function _getThisMonthsReferers() {
    $today = new DateTime();

    return $this->Visitor->find('all', array(
        'fields' => array(
            'Referer.url',
            'COUNT(UserRequest.visitor_id) as request_count',
            'COUNT(DISTINCT(Visitor.id)) as visitor_count',
            'COUNT(UserRequest.visitor_id) / COUNT(DISTINCT(Visitor.id)) as pages_per_visit',
            'COUNT(DISTINCT(Visitor.id)) / COUNT(UserRequest.visitor_id) * 100 as percent_new_visit'
        ),
        'joins' => array(
            array(
                'table' => 'user_requests',
                'alias' => 'UserRequest',
                'type'  => 'RIGHT',
                'conditions' => array(
                    'UserRequest.visitor_id = Visitor.id'
                )
            )
        ),
        'conditions' => array(
            'Visitor.site_id' => $this->Site->id,
            'MONTH(UserRequest.created)' => $today->format('m'),
            'YEAR(UserRequest.created)' => $today->format('Y')
        ),
        'group' => array(
            'url'
        )
    ));
}

问题是我将如何分页。如果只是将我的代码从模型中复制到控制器中,那就太容易了。问题是我希望将查询保留在我的模型中。

这应该如何在 CakePHP 中完成?

4

2 回答 2

1

自定义查找类型是一种方法。您可以在此处找到更多信息:http: //book.cakephp.org/2.0/en/core-libraries/components/pagination.html#custom-query-pagination

要将您_getThisMonthsReferers变成自定义查找,请按照此http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#creating-custom-find-types

例如:

// model
protected function _findThisMonthsReferers($state, $query, $results = array()) {
    if ($state === 'before') {
        $query['fields'] = ....
        $query['joins'] = ....
        return $query;
    }
    return $results;
}

// controller
public $paginate = array('findType' => 'thisMonthsReferers')

编辑:

我认为应该是:

public $paginate = array('thisMonthsReferers');

但是,我使用的从这个答案派生的解决方案是将其添加到我正在使用的方法中

$this->paginate = array('thisMonthsReferers');

因为我不希望我用在我所有的行动中。然后像这样对模型进行分页。

$this->paginate('Visitor);
于 2012-11-08T17:43:39.423 回答
1

而不是返回查找的结果,只需返回它的选项数组:

return array(
    'fields' => array(
    //...etc

然后使用这些选项在控制器中进行分页。关于这个类似问题的答案的更多详细信息: Paginate from within a model in CakePHP

它仍然保持模型肥大(使用任何可能改变条件、连​​接、字段等的逻辑)和控制器瘦,它只使用返回的数组作为分页选项。

于 2012-11-08T18:27:55.480 回答