TP5多字段排序

dreamhua 2019-10-28

有业务需求如下:

select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);

这里直入主题,用TP的order方法写的话,可能不太好写,但是也可以写成这样

->order("field(id,3,6,9,1,2,5,8,7)")

但是官方文档说了,当你的order排序中使用了SQL函数的时候,请使用orderRaw方法替代order 所以并不太好实现。

所以查阅资料找到方法,资料

$exp = new \think\db\Expression(‘field(id,3,6,9,1,2,5,8,7)‘);
$result = $query->where([‘id‘=>[‘in‘,‘3,6,9,1,2,5,8,7‘]])->order($exp)->select();

这里我直接引用资料中的回答,如果使用模型查询的话就是:

Model::where("id","in","3,6,9,1,2,5,8,7")->order("field(id,3,6,9,1,2,5,8,7)")->select();

还可以用

orderRaw("field(users.id, $ids)"),或者

order(Db::raw("field(users.id, $ids)"))

标题说了,是多字段排序,OK,没有问题,多字段排序,你只需要在实例化Expression类的时候写上就行了

这里只是大概写一下,具体的请根据自己的业务需求进行更改,这里我一共进行了四种不同字段不同需求的排序

$exp = new Expression(‘field(table1.id,null),field(table2.id,null),convert(table3.field3 using gbk) asc,table4.id desc‘);

当然,熟悉的朋友可以直接在->orderRawz中写原生的sql也是没有问题的。

这里只是做一下记录,欢迎留言交流学习。

相关推荐