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

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

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

最新文章

  1. 探索ASP.NET MVC5系列之~~~4.模型篇---包含模型常用特性和过度提交防御
  2. 【linux】配置SSH免密码登陆
  3. linux的文件种类与扩展名
  4. 菜鸟学Linux命令:ssh命令 远程登录
  5. WebApp开发之Cordova安装教程
  6. 如何找到Linux下常用命令的源码
  7. nginx+lua+redis实现logserver
  8. 逻辑性最强的React Native环境搭建与调试
  9. select2 取值 遍历 设置默认值
  10. [LeetCode] Maximum Average Subarray I 子数组的最大平均值
  11. IDEA 新建 module
  12. AutoBat
  13. js BOM浏览器对象模型
  14. python 的类装饰器
  15. 微信小程序如何调用API实现数据请求-wx.request()
  16. numpy.meshgrid()
  17. Redhat6.4安装MongoDBv3.6.3
  18. USB2.0学习笔记连载(九):USB设备驱动的安装
  19. CSS实现跨浏览器兼容性的盒阴影效果
  20. crosses initialization of “XXX” 的问题

热门文章

  1. sql server 大数据, 统计分组查询,数据量比较大计算每秒钟执行数据执行次数
  2. flink Iterate迭代基本概念
  3. Mysql查漏补缺笔记
  4. Model 中的Meta类选项
  5. 【会话技术】Cookie技术 案例:访问时间
  6. PAT 乙级 1042.字符统计 C++/Java
  7. POJ 2516Minimum Cost(最小费用流+特判)
  8. qr.h
  9. java.time.format.DateTimeParseException: Text '2019-10-11 12:30:30' could not be parsed at index 10
  10. 用Python玩转微信