CakePHP Количество страниц не соответствует запросу? - PullRequest
4 голосов
/ 19 августа 2011

У меня довольно измененный запрос разбивки на страницы с использованием нескольких соединений и т. Д., Но по какой-то причине paginator-> counter () никогда не совпадает с результатами запроса подсчета.

Вы можете увидеть его в действии на http://dev.qreer.com/ - при выборе различных опций в навигации LHS вывод запроса будет ниже, а счетчик страниц выглядит довольно случайным.

Есть идеи, где я могу начать отлаживать это?

В контроллере заданий:

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

Пример соединения (есть внутренние соединения для всех таблиц соединений и таблиц данных):

        array(
            'table' => 'education_backgrounds',
            'alias' => 'EducationBackground',
            'type' => 'INNER',
            'conditions' => array('EducationBackgroundsJobs.education_background_id = EducationBackground.id'),
        ),

Состояние образца:

      'EducationBackground.name' => array('Aerospace Engineering');

Ответы [ 3 ]

10 голосов
/ 19 августа 2011

Это из-за 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;
}

Я добавил его в app_model, и он отлично работает для меня:)

Надеюсь, это поможет

Отредактировано: Я нашел ссылку =)

http://wiltonsoftware.com/posts/view/custom-group-by-pagination-and-a-calculated-field

1 голос
/ 19 августа 2011

Понял:

Счетчик 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);
}

Это перезаписывает значение на правильное, и кажется, что все работает отлично.

Учитывая, что я добавил Configure::write('paginate', array('params' => $this->paginate['Job'])); в свой контроллер, чтобы я мог получить доступ к параметрам пагинации.

0 голосов
/ 04 сентября 2013

function paginateCount ($ condition = 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);
           }

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

...