• TP5 按照汉字的拼音排序


    业务需求:接口返回一个列表,但是这个列表要求按一定的条件排序,条件如下:

    1,某字段(field1)为null的排前面

    2,某字段(field2)为null的排前面

    3,姓名(field3)按照汉字的拼音排序

    4,某字段(field4)按照ID倒序排序

    乍一听有点复杂,其他的不多说,这篇文章主要讲怎么在TP5里实现按照汉字的拼音排序

    多字段排序这里要介绍到TP5 一个类 想了解的可以参考这篇文章TP5多字段排序

    查阅了资料,网上千篇一律,总结了两点:

    1,如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了),直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序;

    2,如果存储姓名的字段采用的是 utf8字符集,需要在排序的时候对字段进行转码;对于的代码是 order by convert(name using gbk) asc; 同样,查询的结果也是按照姓氏的升序排序;

    我相信大多数人用的应该是用的utf8字符集,所以这里就使用第二种方法

    但是在TP中,如果使用不当,就会报错

     正确的写法应该使用这篇文章TP5多字段排序中的方法,TP中的一个类,超级简单超级好用。

    //实例化这个类,并在实例化的时候传入你需要的排序规则
    $exp = new Expression('field(table1.field1,null),field(table2.field2,null),convert(table3.field3 using gbk) asc,table4.field4 desc');
    

     

    //这里是示例代码,具体需要根据自己的业务逻辑进行修改
    $list = Model::join('table2 t2', 't1.id = t2.id','LEFT')
                 ->join('table3 t3', 't1.id = t3.id','LEFT')
                 ->join('table4 t4','t4.id = t3.id')
                 ->field('你需要的字段')
                 ->orderRaw($exp)
                 ->with(['这里我进行了关联关系查询,不需要的可以用写'])->where('查询条件');

    这样多字段排序就完成了,不知道有没有人注意到

    我并没有使用order,而是使用了orderRaw,为什么呢?我们来看看官方文档

    当你的order排序中使用了SQL函数的时候,请使用orderRaw方法替代order

    然后我们来看看查询的效果,结果显而易见,成功的按照汉字的拼音排序

    如果想到倒序,你只需要在实例化的时候把asc改为desc即可。

     总之,个人觉得这个方法非常好用,所以在这里记录下来,欢迎留言学习交流。

  • 相关阅读:
    tornado用户验证
    tornado cookie安全性
    XSS攻击
    《R语言入门》语言及环境简单介绍
    angular学习(十五)——Provider
    Tomcat 8(九)解读Tomcat组件的生命周期(Lifecycle)
    Windows之Xmanager连接linux打开Oracle视图操作
    CreateEvent和SetEvent及WaitForSingleObject的使用方法
    利用Sharepoint 创建轻量型应用之基本功能配置!
    android开发源代码分析--多个activity调用多个jni库的方法
  • 原文地址:https://www.cnblogs.com/blibli/p/11754672.html
Copyright © 2020-2023  润新知