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即可。
总之,个人觉得这个方法非常好用,所以在这里记录下来,欢迎留言学习交流。
TP5 按照汉字的拼音排序的更多相关文章
- MySQL按照汉字的拼音排序
按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...
- MySQL按照汉字的拼音排序,mysql汉字排序
按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...
- MySQL按照汉字的拼音排序(转)
按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...
- [转]Java汉字按照拼音排序
最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较. @Test public void test_sort_pinyin() { Collator cmp = Collator. ...
- MySQL按照汉字的拼音排序、按照首字母分类
项目中有时候需要按照汉字的拼音排序,比如联系人列表.矿物分类等,有的还需要按拼音字母从A到Z分类显示. 如果存储汉字的字段编码使用的是GBK字符集,因为GBK内码编码时本身就采用了拼音排序的方法(常用 ...
- js中文汉字按拼音排序
JavaScript 提供本地化文字排序,比如对中文按照拼音排序,不需要程序显示比较字符串拼音. String.prototype.localeCompare 在不考虑多音字的前提下,基本可以完美实现 ...
- PostgreSQL下,对汉字按拼音排序
参考学习此文: http://blog.163.com/digoal@126/blog/static/163877040201173003547236/ 建库 postgres=# \l List o ...
- PostgreSQL对汉字按拼音排序
转自:https://www.cnblogs.com/gaojian/p/3188609.html postgres=# \l List of databases Name | Owner | Enc ...
- js 中实现 汉字按拼音排序
let arr = ["贵州省", "江苏省", "江西省", "浙江省", "四川省", &quo ...
随机推荐
- uni-app通过判断接口403跳转登录页面的问题
需求: 当向后端请求接口返回 403 的时候,直接跳到登录页面让用户登录 实现方案: 在请求结束后拦截器中判断,如果是 403 就跳转 遇到难题: 一级页面(我的) onShow() 中有接口请求,用 ...
- 一、Hadoop入门概述
一.Hadoop是什么 Hadoop是一个由Apche基金会所开发的分布式系统基础架构. 主要解决海量数据的存储和海量数据的分析计算问题. 广义上来说,Hadoop通常是指一个更广泛的概念—Hadoo ...
- MySQL 错误代码:2003 idea错误:ERROR DruidDataSource:1846 - create connection error
idea项目一启动就报错: 20:01:13,047 ERROR DruidDataSource:1846 - create connection error com.mysql.jdbc.excep ...
- LCD编程框架组织
看下面的代码,你会发现韦老师这种组织与内核框架的组织是一脉相承的. led.c #define LCD_NUM 10 static p_lcd_params p_array_lcd[LCD_NUM]; ...
- 转: angularjs select 赋值 ng-options配置方式
摘自: http://blog.csdn.net/chwshuang/article/details/53861249 数组方式 数据是数组 $scope.years = [2014, 2015, 2 ...
- Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记
第 6 章 单例模式与多线程 本章主要内容 如何使单例模式遇到多线程是安全的.正确的. 6.1 立即加载 / “饿汉模式” 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就 ...
- IE float 双边距
IE 浮动元素的双边距
- postgres9.5.3升级postgres11.6
附上postgres下载地址: https://yum.postgresql.org/11/redhat/rhel-7-x86_64/repoview/postgresqldbserver11.gro ...
- jQyery简史和下载引用方法
1.jQuery简介 jQuery是一个快速,小型且功能丰富的JavaScript库.借助易于使用的API(可在多种浏览器中使用),使HTML文档的遍历和操作,事件处理,动画和Ajax等事情变得更加简 ...
- requests-html
目录 一 介绍 二 安装 三 如何使用requests-html 四 支持JavaScript 五 自定义User-Agent 六 模拟表单提交 七 支持异步请求 一 介绍 Python上有一个非常著 ...