一、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'
