代码改变世界

ThinkPHP6手册里没有的一些用法

2020-03-07 01:44  盛世游侠  阅读(1787)  评论(0编辑  收藏  举报

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