ThinkPHP6手册里没有的一些用法

摘要:
ThinkPHP6使用Db::raw()替代了_string来实现混合查询。使用Db::raw()也可以对字段使用mysql函数://原来ThinkPHP3.2这样写的:if{$map['sell_time']=array$tsort='order_ticket_sell.sell_timedesc';}else{$map['_string']="CONCAT˃='".$dtBegin."'andCONCAT'desc'];}else{$tic_ft_raw=Db::raw;$key_map['tic_ft_time']=array;$tsort=['tic_f.date'=˃'desc','tic_f.time'=˃'desc'];}//ThinkPHP6不像ThinkPHP3.2的WHERE那样能用关联数组了,所以自己建个关联数组来存放查询条件,以便需要修改或删除某个查询条件的时候,可以使用关联键方便的修改或UNSET掉关联键。

一、COUNT()方法统计去重:

//链式操作最后是COUNT()方法结尾时,distinct要放到COUNT方法里面的字段参数前面才起统计去重作用

//错误的写法:
$query->distinct(true)->field('ots.order_no')->where($map)->count();

//将生成这样的sql
SELECT DISTINCT COUNT(*) ASthink_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'

免责声明:文章转载自《ThinkPHP6手册里没有的一些用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇查询速度慢的原因很多,常见如下几种DELPHI 字符串分割处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章