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

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. 【开发笔记】- Grails框架定义一个不是数据库字段得属性

    实体类 class Book{ String name String author // myfiled 我不想他在数据库中生成book表的字段 String myfield } 添加声明 class ...

  2. A MacFUSE-Based Process File System for Mac OS X

    referer: http://osxbook.com/book/bonus/chapter11/procfs/ Processes as Files The process file system  ...

  3. android studio学习----Warning:Unable to find optional library: org.apache.http.legacy

    主要是没有  android-23的版本 1.导入工程以后 Error:Could not find com.Android.tools.build:gradle:1.3.1. Searched in ...

  4. Python Django 实现简单注册功能

    Python Django 实现简单注册功能 项目创建略,可参考前期文档介绍. 目录结构如下 编辑views.py from django.shortcuts import render # Crea ...

  5. Flink流式计算

    Structured Streaming A stream is converted into a dynamic table. A continuous query is evaluated on ...

  6. OpenLDAP 常用命令

    OpenLDAP 常用命令 本文原始地址:https://sitoi.cn/posts/5308.html ldapsearch ldapsearch - ldap 搜索工具 ldapsearch 实 ...

  7. MicroK8s及KubeFlow安装文档

    安装简单的k8s大约有三种思路:minikube,microk8s,kubeadm.minikube 虽然是官方出品,但主要还是基于虚拟机做的设计.在 Linux 生产环境下,microk8s 可能是 ...

  8. Leetcode周赛164

    目录 访问所有点的最小时间 思路 代码 统计参与通信的服务器 思路 代码 搜索推荐系统 思路 代码 停在原地的方案数 思路 代码 访问所有点的最小时间 思路 由于每次移动有水平方向移动一格.竖直方向移 ...

  9. mysql在windows(含客户端工具)及linux(yum)环境下安装

    下载 地址:https://dev.mysql.com/downloads/ windows安装包下载 linux安装包下载 https://dev.mysql.com/downloads/mysql ...

  10. mybatis框架,使用foreach实现复杂结果的查询--循环集合数组

    需求:假定现在查询出用户角色是2和3指定的用户列表信息,并进行展示 接口: /** * 需求:传入指定的用户角色,用户角色有1-n,获取这些用户角色下的用户列表信息 * @param roleids ...