Intereting Posts

cakephp paginate с помощью mysql SQL_CALC_FOUND_ROWS

Я пытаюсь сделать Cakephp paginate использовать функцию SQL_CALC_FOUND_ROWS в mysql, чтобы возвращать количество полных строк при использовании LIMIT. Надеюсь, это может устранить двойной запрос paginateCount (), а затем paginate ().

  • http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

Я поместил это в свой 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 ()?

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

Q: можем ли мы каким-либо образом получить результаты запроса для прямой печати, без дополнительного запроса?

  $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); 

Q: можем ли мы каким-то образом получить $ cache_results_for_paginate непосредственно из paginateCount ()?

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

Solutions Collecting From Web of "cakephp paginate с помощью mysql SQL_CALC_FOUND_ROWS"

То, как я решаю это для разбиения на страницы результатов веб-службы, которая возвращает результаты для текущей страницы, и общее количество результатов, доступных в том же ответе, – это копирование свойства paginate из контроллера в модель в действии вашего контроллера, прежде чем вы вызовите $ this-> paginate (); так что мои настройки поискового вызова доступны в методе paginateCount () модели. Затем в paginateCount () выполните вызов веб-службы, чтобы получить результаты. Затем сохраните результаты в свойстве модели, а затем верните общее количество доступных результатов. Затем в методе paginate () модели я возвращаю результаты, которые я извлечил и сохранил в методе paginateCount ().

Возможно, что-то в этом направлении может работать и на вас?