有業務需求如下:
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也是沒有問題的。
這里只是做一下記錄,歡迎留言交流學習。