ThinkPHP6手冊里沒有的一些用法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM