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

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即可。

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

TP5 按照汉字的拼音排序的更多相关文章

  1. MySQL按照汉字的拼音排序

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  2. MySQL按照汉字的拼音排序,mysql汉字排序

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  3. MySQL按照汉字的拼音排序(转)

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  4. [转]Java汉字按照拼音排序

    最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较. @Test public void test_sort_pinyin() { Collator cmp = Collator. ...

  5. MySQL按照汉字的拼音排序、按照首字母分类

    项目中有时候需要按照汉字的拼音排序,比如联系人列表.矿物分类等,有的还需要按拼音字母从A到Z分类显示. 如果存储汉字的字段编码使用的是GBK字符集,因为GBK内码编码时本身就采用了拼音排序的方法(常用 ...

  6. js中文汉字按拼音排序

    JavaScript 提供本地化文字排序,比如对中文按照拼音排序,不需要程序显示比较字符串拼音. String.prototype.localeCompare 在不考虑多音字的前提下,基本可以完美实现 ...

  7. PostgreSQL下,对汉字按拼音排序

    参考学习此文: http://blog.163.com/digoal@126/blog/static/163877040201173003547236/ 建库 postgres=# \l List o ...

  8. PostgreSQL对汉字按拼音排序

    转自:https://www.cnblogs.com/gaojian/p/3188609.html postgres=# \l List of databases Name | Owner | Enc ...

  9. js 中实现 汉字按拼音排序

    let arr = ["贵州省", "江苏省", "江西省", "浙江省", "四川省", &quo ...

随机推荐

  1. 78.3D立体轮播图(完整兼容手机端和pc端)

    效果呈现来源于http://www.jq22.com/demo/jR3DCarousel-master20160315/ 在此基础上改成需要的3个分类的3D图 由于原有的不支持粘贴复制显示3个分类 我 ...

  2. vue开发相关问题以及解决方案

    1.使用ref获取到dom元素,但是无法获取到dom元素的样式? 给div盒子加上<div ref="remove">, 在控制台打印为undefined. 此时我们打 ...

  3. Vue递归组件实现层层嵌套显示数据

    问题来自朋友...记录一下 需求是表格头部后端返回的数据中是不确定的 n维数据,表头存在于 listVo 字段中,如何实现层层显示呢? 温馨提示,以下内容为5张大图,请打开 WIFI 享用... 以下 ...

  4. c# 开发+MySql数据库

    今天就一个客户端的任务:1.把Excel文件转成特定格式插入到数据库中:2.查出该文件,并且导出Excel文件:3.如果插入数据错误,则把刚插入的数据删除掉.感觉比较简单,可是,墨迹了一天呀....总 ...

  5. 深浅拷贝、集合set、函数、日志

    #-----深浅拷贝---- import copy a = ["xiaoming",111,[5000,2000]] b = a print("b:%s" % ...

  6. linux 以导入文件形式添加定时任务(crontab)时需要注意的坑

    在实际操作过程中发现,使用导入文件形式添加定时任务时,会将用户已有的定时任务全部覆盖清理(先清空,再重新导入),所以在使用文件导入定时任务时,需要先将已有定时任务导出,然后将新任务进行追加到已有定时任 ...

  7. oneinstack——证书更新

    如果你安装好 oneinstack 你的定时任务就会自动添加 "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh ...

  8. 22-C#笔记-预编译指令

    基本和C++一致. 参考: http://www.runoob.com/csharp/csharp-preprocessor-directives.html

  9. python nose测试框架全面介绍十三 ---怎么写nose插件

    之前有一篇文章介绍了自己写的插件 nose进度插件,但最近有朋友问我,看着nose的官方文档写的插件没用,下面再详细介绍一下 一.准备 1.新建一个文件夹,随便文件夹的名字,假设文件夹放在f://aa ...

  10. 【oracle】去重

    基本去重: SELECT DISTINCT * FROM TABLE; 其他去重: 待添加