写代码的时候发现一个排序的问题tp5.1 的order 函数 如果排序字段是字符串类型的小数,你会发现使用order函数怎么排序都不正常,看到这个现象你们大概也猜到原因了,到最后执行sql的时候类型没有转化,那怎么处理这个呢?
我使用的是sql 直接转换,那么问题来了,怎么自定义排序,或者说怎么在模型排序中间加上自定义的一段sql排序,可以使用orderRaw函数,看看源码的介绍
/**
* 表达式方式指定Field排序
* @access public
* @param string $field 排序字段
* @param array $bind 参数绑定
* @return $this
*/
public function orderRaw($field, $bind = [])
{
if ($bind) {
$this->bindParams($field, $bind);
}
$this->options['order'][] = $this->raw($field);
return $this;
}
看这个源码可以知道,第一个参数你写什么直接回原封不动的丢到sql中去,第二个参数是参数绑定只有在外部传值的时候需要(从浏览器获取值传入sql),所以,忽略$bind参数,让它为空就好(不管它)
所以最后的排序的的写法为:
return $this->hasMany('testuModel','product_id','id')->orderRaw("CONVERT(price, DECIMAL) ASC")->order('count', 'asc')->order('id', 'desc')
执行的sql
SELECT * FROM `test` WHERE `product_id` = 3 AND `product_id` = 3 ORDER BY CONVERT(price, DECIMAL) ASC,`count` ASC,`id` DESC