我正在尝试使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
}
答案 0 :(得分:0)
我解决此问题的方法是从Web服务中分页结果,该服务返回当前页面的结果以及同一响应中可用的结果总数,将paginate属性从控制器复制到控制器操作中的模型,在你打电话给$ this-> paginate()之前;这样我的分页设置在模型的paginateCount()方法中可用。然后在paginateCount()中发出对webservice的调用以获得结果。然后将结果存储在模型的属性中,然后返回可用结果的总数。然后在模型的paginate()方法中,我返回我获取并存储在paginateCount()方法中的结果。
也许这些方面的东西也可能适合你?