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也是没有问题的。
这里只是做一下记录,欢迎留言交流学习。