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

検索結果を返す代わりに、オプションの配列を返すだけです。

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

次に、これらのオプションを使用して、コントローラーでページ付けします。この同様の質問のこの回答の詳細: CakePHP のモデル内からのページ付け

それはまだモデルをファット(条件、結合、フィールドなどを変更する可能性のあるロジックを含む)に保ち、コントローラーをスキニーに保ちます。これは、返された配列をページネーションオプションとして使用するだけです。

于 2012-11-08T18:27:55.480 に答える
1

カスタム検索タイプは 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/retriving-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 に答える