tp5.1模型count()方法建议优化

浏览:7962 发布日期:2018/06/08 分类:ThinkPHP5专区 关键字: count 分页 isset empty group 模型聚合
/**
     * COUNT查询
     * @access public
     * @param  string $field 字段名
     * @return integer|string
     */
    public function count($field = '*')
    {
        //if (isset($this->options['group'])) { //原来代码
        if (!empty($this->options['group'])) {//建议修改
            // 支持GROUP
            $options = $this->getOptions();
            $subSql  = $this->options($options)->field('count(' . $field . ') AS think_count')->bind($this->bind)->buildSql();

            $query = $this->newQuery()->table([$subSql => '_group_count_']);

            if (!empty($options['fetch_sql'])) {
                $query->fetchSql(true);
            }

            return $query->aggregate('COUNT', '*', true);
        }

        return $this->aggregate('COUNT', $field, true);
    }
举个例子:
分页查询某个数据列表,并返回数据集总个数和分页内容,查询可携带有多种筛选条件。$page = input('get.page',1);
        $pageSize = input('get.pageSize',10);
        $review_status = input('get.review_status','all');

        $model = new \app\common\model\Ticket();
        $model = $model->alias('t')
            ->join('order o','o.ticket_id = t.id')
            ->join('user_company c','c.user_id = t.creator_id')
            ->field('t.id,o.order_no,t.bank_type,c.province,c.city,t.ticket_no,
            t.acceptor,t.accept_money,t.expire_date,t.create_time,t.is_checked,font_image_key,back_image_key');
        if(in_array(intval($review_status),[0,1,2])){
            $model = $model->where('t.is_checked',$review_status);
        }
        $row = $model
            ->page($page,$pageSize)
            ->order('t.create_time desc')
            ->select();
        $total = $model->count();
//这里出问题了,按照count方法
//if (isset($this->options['group'])) 
//此时我虽然一直没调用过group方法,
//但是dump($modle);显示
//$model->options['group']='';
//所以用isset判断是true的,
//所以就会生成 subSql,
// 所以最终的sql是:
//      ["queryString"] => string(536) "SELECT COUNT(*) AS tp_count FROM ( SELECT `t`.`id`,`o`.`order_no`,`t`.`bank_type`,`c`.`province`,`c`.`city`,`t`.`ticket_no`,`t`.`acceptor`,`t`.`accept_money`,`t`.`expire_date`,`t`.`create_time`,`t`.`is_checked`,`font_image_key`,`back_image_key`,count(*) AS think_count FROM `ticket` `t` INNER JOIN `order` `o` ON `o`.`ticket_id`=`t`.`id` INNER JOIN `user_company` `c` ON `c`.`user_id`=`t`.`creator_id` WHERE (  `t`.`is_checked` = '0' ) AND `t`.`delete_time` IS NULL ORDER BY `t`.`create_time` DESC LIMIT 0,10 ) `_group_count_` LIMIT 1  "
//然而我并没有调用group方法,只是想count(*) from table;
//我期望的是
//      ["queryString"] => string(286) "SELECT COUNT(*) AS tp_count FROM `ticket` `t` INNER JOIN `order` `o` ON `o`.`ticket_id`=`t`.`id` INNER JOIN `user_company` `c` ON `c`.`user_id`=`t`.`creator_id` WHERE (  `t`.`is_checked` = :where_AND_t_is_checked ) AND `t`.`delete_time` IS NULL ORDER BY `t`.`create_time` DESC LIMIT 1  "
//所以我建议,isset判断改为!empty判断,那么这样就不会处理group.



        if(!empty($row)){
            $return['row'] = $row->toArray();
        }else{
            $return['row'] = [];
        }
        $return['total']=$total;
        $return['page'] = $page;
最佳答案
评论( 相关
后面还有条评论,点击查看>>