Порядок сортировки CakePHP не влияет на все записи

В моем приложении CakePHP 2.7.7 у меня возникла проблема, из-за которой использование PaginatorComponent неправильно сортирует мои результаты. См. эту ссылку для изображения: Пример данных

Данные должны быть отсортированы по убыванию фамилии, но вы можете видеть, что есть пара пользователей, которые, по-видимому, освобождены от этих данных. Неважно, в каком порядке я это делаю, по возрастанию или по убыванию, эти несколько записей не сортируются. Для справки:

index() в UsersController:

public function index() {
    $this->User->contain('Status');
    $this->paginate = array(
        'limit' => 15,
        'order' => array('User.last_name' => 'DESC'),
        'conditions' => array('User.department_id =' => $this->Session->read('Auth.User.department_id')),
        'contain' => 'Status'
    );
    $this->set('users', $this->Paginator->paginate());
}

Любые идеи, что могло вызвать это? Я в недоумении. Заранее спасибо!

SELECT `User`.`id`, `User`.`first_name`, `User`.`last_name`, `User`.`middle`, `User`.`address`, `User`.`address_2`, `User`.`city`, `User`.`state_id`, `User`.`zip`, `User`.`home`, `User`.`cell`, `User`.`work`, `User`.`email`, `User`.`status_id`, `User`.`status_reason`, `User`.`rank`, `User`.`birthday`, `User`.`gender`, `User`.`school`, `User`.`employer`, `User`.`position`, `User`.`created`, `User`.`modified`, `User`.`updated_by`, `User`.`radio`, `User`.`ident`, `User`.`parent_name`, `User`.`parent_number`, `User`.`parent_email`, `User`.`squad`, `User`.`squad_leader`, `User`.`ride_along`, `User`.`drivers_license`, `User`.`username`, `User`.`password`, `User`.`department_id`, `User`.`join_date`, `User`.`group_id`, `User`.`test`, (CONCAT(`User`.`first_name`, " ", `User`.`last_name`)) AS `User__name`, `Status`.`id`, `Status`.`status` FROM `admin_cake`.`users` AS `User` LEFT JOIN `admin_cake`.`statuses` AS `Status` ON (`User`.`status_id` = `Status`.`id`) WHERE `User`.`department_id` = 1 ORDER BY `User`.`last_name` ASC LIMIT 15

person Jason    schedule 15.12.2015    source источник
comment
Какой SQL-запрос генерируется для этого?   -  person drmonkeyninja    schedule 16.12.2015
comment
Убедитесь, что в фамилиях нет начального пробела.   -  person Inigo Flores    schedule 16.12.2015
comment
@drmonkeyninja Я обновил вопрос с образцом запроса.   -  person Jason    schedule 16.12.2015
comment
@InigoFlores Я думал так же, но не могу найти записи с дополнительным пробелом.   -  person Jason    schedule 16.12.2015
comment
@ Джейсон, твой SQL выглядит правильно. Если вы запустите этот запрос непосредственно в базе данных, вы получите желаемый результат или это неверно? Если запрос не работает, этот вопрос может быть лучше переформулирован как проблема MySQL, а не проблема Cake.   -  person drmonkeyninja    schedule 16.12.2015
comment
@drmonkeyninja Я просто предположил, что MySQL работает, но когда я запустил этот запрос в phpMyAdmin, проблема стала до боли ясной. Столбец last_name зашифрован, поэтому столбец ORDER BY сортировал зашифрованные данные в алфавитном порядке, а не фактические фамилии. Теперь, чтобы выяснить, как сортировать после расшифровки...   -  person Jason    schedule 16.12.2015


Ответы (1)


Когда вы используете $this->paginate для установки условий, лимита... вам нужно использовать функцию $this->pagination(). $this->pagination и $this->Paginator->pagination() не могут быть объединены.

1)

public function index() {
    $this->User->contain('Status');
    $this->paginate = array(
        'limit' => 15,
        'order' => array('User.last_name' => 'DESC'),
        'conditions' => array('User.department_id =' => $this->Session->read('Auth.User.department_id')),
        'contain' => 'Status'
    );
    // Assign settings
    $this->Paginator->settings = $this->paginate;
    $this->set('users', $this->Paginator->paginate());
}

2)

public function index() {
    $this->User->contain('Status');
    $this->paginate = array(
        'limit' => 15,
        'order' => array('User.last_name' => 'DESC'),
        'conditions' => array('User.department_id =' => $this->Session->read('Auth.User.department_id')),
        'contain' => 'Status'
    );
    //Don't use $this->Paginator->paginate()
    $this->set('users', $this->paginate());
}
person Nguyễn Nhân    schedule 16.12.2015
comment
Изначально у меня был $this->paginate(), но я перепутал $this->Paginator->paginate() с некоторыми другими вещами, которые пробовал. Я переключил его обратно и получил тот же результат. - person Jason; 16.12.2015