order高级排序
可以使用order方法结合case语句进行条件排序。以下示例展示了如何按照销量和上架时间进行动态排序:
use think\facade\Db;
Db::name('goods')
->orderRaw("case when sales >= 1000 then 0 else 1 end, putaway_time desc")
->select();
在上面的示例中,orderRaw方法使用了原生的SQL表达式,其中包含了case语句。case语句的作用是根据销量进行分类,如果销量超过了1000,则分类为0,否则分类为1。然后按照分类结果进行排序,分类结果相同的再按照上架时间从晚到早排序。
另外,也可以使用orderCase方法对多个字段进行动态排序。例如,以下示例展示了如何按照商品价格和销量进行动态排序:
use think\facade\Db;
Db::name('goods')
->orderCase([
'(price < 50)' => '2', // 如果价格小于50,优先级最高,分类值为2
'(sales > 1000)' => '1', // 如果销量大于1000,优先级次之,分类值为1
'1=1' => '0', // 如果都不符合,优先级最低,分类值为0
], [
'price' => 'asc', // 按照价格从低到高排序
'sales' => 'desc', // 如果价格相同,则按照销量从高到低排序
])
->select();
在上面的示例中,orderCase方法的第一个参数是一个关联数组,键名是要进行分类的表达式,键值是分类值。如果要同时对多个条件进行判断,可以使用括号将条件括起来,并用逻辑运算符连接。分类值越大,优先级越高。第二个参数和之前的示例一样,表示按照价格和销量进行排序。
需要注意的是,在使用orderRaw或orderCase方法时,要注意安全性问题,避免SQL注入攻击。可以使用Db::raw方法将原生的SQL表达式转义为字符串。