/**
* 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; 最佳答案