cakephp paginate使用mysql SQL_CALC_FOUND_ROWS

时间:2010-05-08 07:03:29

标签: php mysql cakephp paginate

我正在尝试使Cakephp paginate利用mysql中的SQL_CALC_FOUND_ROWS功能在使用LIMIT时返回总行数。希望这可以消除paginateCount()的双重查询,然后是paginate()。

我把它放在我的app_model.php中,它基本上有效,但它可以做得更好。有人可以帮我弄清楚如何覆盖paginate / paginateCount所以它只执行1个SQL stmt?

/**
 * Overridden paginateCount method, to using SQL_CALC_FOUND_ROWS
 */
public function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
    $options = array_merge(compact('conditions', 'recursive'), $extra);
    $options['fields'] = "SQL_CALC_FOUND_ROWS `{$this->alias}`.*";

问:如何获得paginate()中使用的SAME限制值?

    $options['limit'] = 1;   // ideally, should return same rows as in paginate()     

问:我们可以以某种方式直接对查询结果进行分页,而不需要额外的查询吗?

    $cache_results_from_paginateCount = $this->find('all', $options);   
    /*
     * note: we must run the query to get the count, but it will be cached for multiple paginates, so add comment to query
     */
    $found_rows =  $this->query("/* do not cache for {$this->alias} */ SELECT FOUND_ROWS();");
    $count = array_shift($found_rows[0][0]);
    return $count;
}   

/**
 * Overridden paginate method
 */
public function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) {
    $options = array_merge(compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive'), $extra);

问:我们可以通过某种方式直接从paginateCount()获取$ cache_results_for_paginate吗?

    return $cache_results_from_paginateCount;  // paginate in only 1 SQL stmt
    return $this->find('all', $options);   // ideally, we could skip this call entirely
}

1 个答案:

答案 0 :(得分:0)

我解决此问题的方法是从Web服务中分​​页结果,该服务返回当前页面的结果以及同一响应中可用的结果总数,将paginate属性从控制器复制到控制器操作中的模型,在你打电话给$ this-> paginate()之前;这样我的分页设置在模型的paginateCount()方法中可用。然后在paginateCount()中发出对webservice的调用以获得结果。然后将结果存储在模型的属性中,然后返回可用结果的总数。然后在模型的paginate()方法中,我返回我获取并存储在paginateCount()方法中的结果。

也许这些方面的东西也可能适合你?