У меня есть довольно измененный запрос на разбиение на страницы с использованием нескольких ссылок и т. Д., Но по какой-то причине параметр paginator-> counter () никогда не соответствует результатам запроса count.
Вы можете увидеть его в действии по адресу http://dev.qreer.com/ – путем выбора различных опций навигации LHS, выход запроса ниже, а число paginator выглядит довольно случайным.
Любая идея, где я могу начать отлаживать это?
В контроллере рабочих мест:
$this->paginate = $this->Job->paginateParams($data); $jobs = $this->paginate('Job'); $this->set(compact('jobs'));
В модели:
function paginateParams($data = null){ //lots of joins + conditions return array('contain' => $contain, 'recursive' => 0,'joins' => $joins, 'conditions' => $conditions, 'group' => 'Job.id', 'order' => $order); }
Sample Join (есть внутренние соединения для всех таблиц соединений и таблиц данных):
array( 'table' => 'education_backgrounds', 'alias' => 'EducationBackground', 'type' => 'INNER', 'conditions' => array('EducationBackgroundsJobs.education_background_id = EducationBackground.id'), ),
Пример состояния:
'EducationBackground.name' => array('Aerospace Engineering');
Из-за group by
я нашел обходной путь. Я бы хотел поместить ссылку, но я ее потерял, поэтому я отправлю код:
public function paginateCount($conditions = null, $recursive = 0, $extra = array()) { $parameters = compact('conditions', 'recursive'); if (isset($extra['group'])) { $parameters['fields'] = $extra['group']; if (is_string($parameters['fields'])) { // pagination with single GROUP BY field if (substr($parameters['fields'], 0, 9) != 'DISTINCT ') { $parameters['fields'] = 'DISTINCT ' . $parameters['fields']; } unset($extra['group']); $count = $this->find('count', array_merge($parameters, $extra)); } else { // resort to inefficient method for multiple GROUP BY fields $count = $this->find('count', array_merge($parameters, $extra)); $count = $this->getAffectedRows(); } } else { // regular pagination $count = $this->find('count', array_merge($parameters, $extra)); } return $count; }
сpublic function paginateCount($conditions = null, $recursive = 0, $extra = array()) { $parameters = compact('conditions', 'recursive'); if (isset($extra['group'])) { $parameters['fields'] = $extra['group']; if (is_string($parameters['fields'])) { // pagination with single GROUP BY field if (substr($parameters['fields'], 0, 9) != 'DISTINCT ') { $parameters['fields'] = 'DISTINCT ' . $parameters['fields']; } unset($extra['group']); $count = $this->find('count', array_merge($parameters, $extra)); } else { // resort to inefficient method for multiple GROUP BY fields $count = $this->find('count', array_merge($parameters, $extra)); $count = $this->getAffectedRows(); } } else { // regular pagination $count = $this->find('count', array_merge($parameters, $extra)); } return $count; }
Я добавил его в app_model, и он отлично работает для меня 🙂
Надеюсь это поможет
Отредактировано: Я нашел ссылку =)
http://wiltonsoftware.com/posts/view/custom-group-by-pagination-and-a-calculated-field
Догадаться:
Счетчик paginator полагается на $this->find('count')
чтобы вернуть целое число итогов, что по какой-то причине не нравится параметр «group». Итак, следуя пользовательской настройке запроса (которая также рекомендует в нижней части страницы делать подсчет самостоятельно для любой пользовательской / измененной разбивки на страницы) – я добавил следующую модель:
function paginateCount(){ $params = Configure::read('paginate.params'); $params['fields'] = 'DISTINCT (Job.id)'; unset($params['group']); unset($params['contain']); unset($params['order']); return $this->find('count', $params); }
неfunction paginateCount(){ $params = Configure::read('paginate.params'); $params['fields'] = 'DISTINCT (Job.id)'; unset($params['group']); unset($params['contain']); unset($params['order']); return $this->find('count', $params); }
неfunction paginateCount(){ $params = Configure::read('paginate.params'); $params['fields'] = 'DISTINCT (Job.id)'; unset($params['group']); unset($params['contain']); unset($params['order']); return $this->find('count', $params); }
неfunction paginateCount(){ $params = Configure::read('paginate.params'); $params['fields'] = 'DISTINCT (Job.id)'; unset($params['group']); unset($params['contain']); unset($params['order']); return $this->find('count', $params); }
Это перезаписывает значение с правильным, и все это, кажется, работает отлично.
Принимая во внимание, я добавил Configure::write('paginate', array('params' => $this->paginate['Job']));
к моему контроллеру, чтобы я мог получить доступ к параметрам разбивки на страницы.
function paginateCount ($ conditions = null, $ recursive = 0, $ extra) {
$db = $this->getDataSource(); $sql = $db->buildStatement( array( 'fields' => array('DISTINCT Gdi.id'), 'table' => $db->fullTableName($this), 'alias' => 'Gdi', 'limit' => null, 'offset' => null, 'joins' => isset($extra['joins'])?$extra['joins']:null, 'conditions' => $conditions, 'order' => null, 'group' =>isset($extra['group'])?$extra['group']:null ), $this ); $this->recursive = $recursive; $results = $this->query($sql); return count($results); }
Просто добавьте эту функцию в свою модель и измените имя поля и имя модели. С помощью этой функции вы можете настроить собственный счетчик запросов.