CakePHP排序忽略大小写

时间:2010-10-23 13:37:16

标签: php sorting cakephp case-insensitive

我必须按照注册票证的人的姓氏对预订清单(它们通过定义belongsTo关联与事件相关联)进行排序。

我在cakePHP中执行此操作:

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

这样可行,但有些用户以小写形式输入数据,这使得排序错误:

Alfa, Ziggy, aardvark, zorro

它应该在哪里:

aardvark, Alfa, Ziggy, zorro

我该如何解决这个问题?我可以循环遍历数组并使用ucword()使每个字符串以大写字母开头,但这看起来有点难看。是不是有一种简单的方法来改变排序算法,所以它忽略了大小写?

3 个答案:

答案 0 :(得分:1)

我会在存储之前规范化姓氏 - 全部小写,全部大写或全部大写。

答案 1 :(得分:0)

您是否有理由不在SQL中执行排序?

我认为在您致电find之前不久有一个Set::sort操作,我想这看起来像是:

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

您可以指示Cake的ORM使用与标准find操作相同的语法对包含的预留进行排序,如下所示:

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

答案 2 :(得分:0)

在代码Set :: sort中看起来像是在引擎http://php.net/manual/en/function.array-multisort.php下使用array_multisort所以它不会给你不区分大小写的排序。您可以查看Set :: sort的代码,并创建自己的Set子类,使用类似natcasesort http://www.php.net/manual/en/function.natcasesort.php的东西,或者先使用mysql进行排序,默认情况下,mysql将不区分大小写排序