TP5 按照汉字的拼音排序
業(yè)務(wù)需求:接口返回一個(gè)列表,但是這個(gè)列表要求按一定的條件排序,條件如下:
1,某字段(field1)為null的排前面
2,某字段(field2)為null的排前面
3,姓名(field3)按照漢字的拼音排序
4,某字段(field4)按照ID倒序排序
乍一聽(tīng)有點(diǎn)復(fù)雜,其他的不多說(shuō),這篇文章主要講怎么在TP5里實(shí)現(xiàn)按照漢字的拼音排序
多字段排序這里要介紹到TP5 一個(gè)類 想了解的可以參考這篇文章《TP5多字段排序》
查閱了資料,網(wǎng)上千篇一律,總結(jié)了兩點(diǎn):
1,如果存儲(chǔ)姓名的字段采用的是GBK字符集,那就好辦了,因?yàn)镚BK內(nèi)碼編碼時(shí)本身就采用了拼音排序的方法(常用一級(jí)漢字3755個(gè)采用拼音排序,二級(jí)漢字就不是了,但考慮到人名等都是常用漢字,因此只是針對(duì)一級(jí)漢字能正確排序也夠用了),直接在查詢語(yǔ)句后面 添加 order by name asc; 查詢結(jié)果按照姓氏的升序排序;
2,如果存儲(chǔ)姓名的字段采用的是 utf8字符集,需要在排序的時(shí)候?qū)ψ侄芜M(jìn)行轉(zhuǎn)碼;對(duì)于的代碼是 order by convert(name using gbk) asc; 同樣,查詢的結(jié)果也是按照姓氏的升序排序;
我相信大多數(shù)人用的應(yīng)該是用的utf8字符集,所以這里就使用第二種方法
但是在TP中,如果使用不當(dāng),就會(huì)報(bào)錯(cuò)
正確的寫(xiě)法應(yīng)該使用這篇文章《TP5多字段排序》中的方法,TP中的一個(gè)類,超級(jí)簡(jiǎn)單超級(jí)好用。
//實(shí)例化這個(gè)類,并在實(shí)例化的時(shí)候傳入你需要的排序規(guī)則
$exp = new Expression('field(table1.field1,null),field(table2.field2,null),convert(table3.field3 using gbk) asc,table4.field4 desc');
//這里是示例代碼,具體需要根據(jù)自己的業(yè)務(wù)邏輯進(jìn)行修改
$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(['這里我進(jìn)行了關(guān)聯(lián)關(guān)系查詢,不需要的可以用寫(xiě)'])->where('查詢條件');
這樣多字段排序就完成了,不知道有沒(méi)有人注意到
我并沒(méi)有使用order,而是使用了orderRaw,為什么呢?我們來(lái)看看官方文檔
當(dāng)你的order排序中使用了SQL函數(shù)的時(shí)候,請(qǐng)使用orderRaw方法替代order
然后我們來(lái)看看查詢的效果,結(jié)果顯而易見(jiàn),成功的按照漢字的拼音排序
如果想到倒序,你只需要在實(shí)例化的時(shí)候把a(bǔ)sc改為desc即可。
總之,個(gè)人覺(jué)得這個(gè)方法非常好用,所以在這里記錄下來(lái),歡迎留言學(xué)習(xí)交流。
總結(jié)
以上是生活随笔為你收集整理的TP5 按照汉字的拼音排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu16.04循环登陆与NVID
- 下一篇: html实战3--精灵图