zoukankan      html  css  js  c++  java
  • 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'
  • 相关阅读:
    idea报“Usage of API documented as @since 1.7”这一问题的解决方法
    分页的总页数算法
    Error evaluating expression 'category.id != null and category.id != '''. Cause: org.apache.ibatis.og
    json日期处理类
    解决maven过滤必需配置文件的方法
    数据库配置文件
    springmvc 提供的统一解决json中文乱码配置
    EXPLAIN 命令详解
    MySQL索引与Index Condition Pushdown(二)
    【MySQL】性能优化之 Index Condition Pushdown
  • 原文地址:https://www.cnblogs.com/macliu/p/12432180.html
Copyright © 2011-2022 走看看