Intereting Posts
Как передать массив из контроллера для просмотра (Laravel 5)? Можно ли изменить методы экземпляра объекта с помощью отражения Как создать простой сканер в PHP? сравнение hash () против crypt () Обновление содержимого div после отправки формы без перезагрузки страницы Объединение двух массивов в виде пар ключевых значений в PHP Как я могу использовать функцию preg_replace PHP для преобразования кодовых точек Unicode в реальные символы / объекты HTML? Поток FTP скачать для вывода symfony: не можем ли мы иметь скрытое поле объекта? Как заставить XPath использовать UTF8? Добавление результатов базы данных в массив Как создать постоянную ссылку с именем месяца вместо использования monthnum? Использование UUID в качестве первичного ключа с Laravel 5 Включить shell_exec () на сервере wamp android error org.json.JSONException: Значение <! DOCTYPE типа java.lang.String не может быть преобразовано в JSONObject

CakePHP Число разбиения на страницы не соответствует запросу?

У меня есть довольно измененный запрос на разбиение на страницы с использованием нескольких ссылок и т. Д., Но по какой-то причине параметр 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); } 

Просто добавьте эту функцию в свою модель и измените имя поля и имя модели. С помощью этой функции вы можете настроить собственный счетчик запросов.