tp5.1 order函数排序无效和orderRaw自定义处理排序

写代码的时候发现一个排序的问题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
posted @ 2020-09-18 20:07  makalo  阅读(3457)  评论(0编辑  收藏  举报