一、COUNT()方法统计去重:
//链式操作最后是COUNT()方法结尾时,distinct要放到COUNT方法里面的字段参数前面才起统计去重作用 //错误的写法: $query->distinct(true)->field('ots.order_no')->where($map)->count(); //将生成这样的sql SELECT DISTINCT COUNT(*) AS think_count FROM `order_ticket_sell` //正确的写法: $query->where($map)->count('distinct ots.order_no'); //将生成这样的sql SELECT COUNT(DISTINCT `ots`.`order_no`) AS think_count FROM `order_ticket_sell`
二、ThinkPHP3.2里面的WHERE的数组参数可以设置_string来接收字符串查询条件,跟数组查询条件一起混合成一个数组传给WHERE作为查询条件。ThinkPHP6使用Db::raw()替代了_string来实现混合查询。
使用Db::raw()也可以对字段使用mysql函数:
//原来ThinkPHP3.2这样写的: if(empty($count_type)) { $map['sell_time'] = array(array('neq','null'),array('EGT',$dtBegin),array('ELT',$dtEnd))$tsort = 'order_ticket_sell.sell_time desc';
} else { $map['_string'] = "CONCAT(tic_feature.date,' ',tic_feature.time)>='" . $dtBegin . "' and CONCAT(tic_feature.date,' ',tic_feature.time)<='" . $dtEnd . "'"; $tsort = 'tic_feature.date desc, tic_feature.time desc'; } //现在ThinkPHP6可以改成这样了: if(empty($count_type)){ $key_map['sell_time'] = array('ots.sell_time', 'between', array($dt_begin,$dt_end)); $tsort = ['ots.sell_time'=>'desc']; } else { $tic_ft_raw = Db::raw("CONCAT(tic_f.date,' ',tic_f.time)"); $key_map['tic_ft_time'] = array($tic_ft_raw, 'between', [$dt_begin, $dt_end]); $tsort = ['tic_f.date'=>'desc', 'tic_f.time'=>'desc']; }
//ThinkPHP6不像ThinkPHP3.2的WHERE那样能用关联数组了,所以自己建个关联数组来存放查询条件,以便需要修改或删除某个查询条件的时候,可以使用关联键方便的修改或UNSET掉关联键。例如下面的查询不需要pay_method这个查询条件了:
UNSET($key_map['sell_time']);
//然后把删掉了pay_method后的查询条件再提出来,以便放到WHERE里去:
$map = array_values($key_map['sell_time']);
三、Query对象可以复用,只要修改WHERE查询条件就可以了,这样代码冗余少些,效率也高些:
//如果是一直在复用最初创建的Query对象,记得要先removeOption('where'),然后再放到新调用的WHERE里去,否则不是更新WHRER条件,而是在原来的WHERE条件后面附加WHERE条件: $key_map['pay_method'] = array('otd.pay_method','=',1); //会员卡支付 $map = array_values($key_map); $ots_query->removeOption('where'); $cardpaytotal = $ots_query->where($map)->sum('price');
四、使用Db::raw的时候,有时会遇到这种错误“Invalid parameter number: number of bound variables does not match number of tokens”,换下单引号豪即可,不允许字符串用双引号。
'sell_time'