CakePHP сортировать игнорировать регистр - PullRequest
1 голос
/ 23 октября 2010

Мне нужно отсортировать список резервирований (они связаны с событием, определив ассоциацию ownTo) по фамилии человека, который зарегистрировал билет.

Я делаю это в cakePHP:

$reservations = Set::sort($eventinfo['Reservation'],'{n}.last_name','asc');

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

Alfa, Ziggy, aardvark, zorro

Где это должно быть:

aardvark, Alfa, Ziggy, zorro

Как я могу это исправить?Я мог бы перебрать массив и заставить каждую строку начинаться с заглавной буквы, используя ucword (), но это выглядит немного уродливо.Нет ли простого способа изменить алгоритм сортировки, чтобы он игнорировал регистр?

Ответы [ 3 ]

1 голос
/ 24 октября 2010

Я бы нормализовал фамилии перед их сохранением - либо строчными, либо прописными, либо прописными.

0 голосов
/ 23 октября 2010

Похоже, что в коде Set :: sort использует array_multisort под капотом http://php.net/manual/en/function.array-multisort.php, поэтому сортировка без учета регистра не предусмотрена. Вы можете посмотреть на код для Set :: sort и создать свой собственный подкласс Set, который использует что-то вроде natcasesort http://www.php.net/manual/en/function.natcasesort.php или использовать mysql, чтобы сначала выполнить сортировку, которая по умолчанию в mysql будет сортировать без учета регистра

0 голосов
/ 23 октября 2010

Есть ли причина, по которой вы не выполняете сортировку в SQL?

Я предполагаю, что незадолго до вызова Set::sort есть операция find, которая, как мне кажется, выглядит примерно так:

$reservations = $this->Event->find('first',array(
    'conditions' => array('Event.id' => $my_event_id),
    'contain' => array('Reservation')
));

Вы можете настроить ORM Cake для сортировки содержащихся в нем резервирований с тем же синтаксисом, что и для стандартной операции find, например:

$reservations = $this->Event->find('first',array(
    'conditions' => array('Event.id' => $my_event_id),
    'contain' => array(
        'Reservation' => array('order'=>'Reservation.last_name')
    )
));
...