0
点赞
收藏
分享

微信扫一扫

ThinkPHP6.0 入门【六】,按时间查询、快捷查询、年月日时间查询、其他查询、聚合查询、子查询、原生查询

小铺有酒一两不够 2022-04-13 阅读 27

 本学习课程以学习为目的一周三篇持续更新,学习代码更新在码云公开仓库,不足之处欢迎朋友们前来指导,写作不易请多多支持,本人创作新手写的不好,不喜勿喷,谢谢大家。

学习目标

  1. 按时间查询
  2. 快捷查询
  3. 年月日时间查询
  4. 其他查询
  5. 聚合查询
  6. 子查询
  7. 原生查询

一.按时间查询

码云提交编号:2657ce26949de3340ad4f0242b2c352c9868f322

  1. 正常情况下我们可以使用><>=<=来筛选匹配时间的数据
    public function time(){
        $data0 = Db::name('user')->where('create_time', '>', '2022-3-23')->select();
        $data1 = Db::name('user')->where('create_time', '<', '2022-3-23')->select();
        $data2 = Db::name('user')->where('create_time', '>=', '2022-3-23')->select();
        $data3 = Db::name('user')->where('create_time', '>=', '2022-3-23')->select();
        return json($data3);
    }

  2. 也可以使用 between 关键字来设置时间的区间
    $data = Db::name('user')->where('create_time', 'between', ['2022-3-23', '2022-3-24'])->select();
    return json($data);

  3. 也可以在  between 前加 not   关键字来设置时间的区间的反向查询

     $data = Db::name('user')->where('create_time', 'not between', ['2022-3-23', '2022-3-24'])->select();
     return json($data);

二.快捷查询

  1. 时间查询的快捷方法为 whereTime(),直接使用><>=、<=,个人觉得和上面的查询方式区别不大,但是这样写会更加有语义,默认的大于>,可以省略
    $data = Db::name('user')->whereTime('create_time', '>', '2022-3-23')->select();
    
    return json($data);
  2. 快捷方式也可以使用 between not between
    $data = Db::name('user')->whereBetween('create_time', ['2022-3-23', '2022-3-24'])->select();
            $data = Db::name('user')->whereNotBetween('create_time', ['2022-3-23', '2022-3-24'])->select();
            return json($data);

  3. 还有一种快捷方式为:whereBetweenTime()和 whereNotBetweenTime()

三.年月日时间查询

  1. 使用 whereYear 查询今年的数据、去年的数据和某一年的数据
    $data = Db::name('user')->whereYear('create_time')->select();//今年
    $data = Db::name('user')->whereYear('create_time', 'last year')->select();//去年
    $data = Db::name('user')->whereYear('create_time', '2020')->select();//指定某一年
    return json($data);

  2. 使用 whereMonth 查询当月的数据、上月的数据和某一个月的数据
    $data = Db::name('user')->whereMonth('create_time')->select();//当月
    $data = Db::name('user')->whereMonth('create_time', 'last month')->select();//上一个月
    $data = Db::name('user')->whereMonth('create_time', '2022-1')->select();//指定某一个月
    return json($data);

  3. 使用 whereDay 查询今天的数据、昨天的数据和某一个天的数据
    $data = Db::name('user')->whereDay('create_time')->select();//今天
    $data = Db::name('user')->whereDay('create_time', 'yesterday')->select();//昨天
    $data = Db::name('user')->whereDay('create_time', '2022-4-8')->select();//指定某一天日期
    return json($data);

四.其他查询

  1. 查询指定时间的数据,比如两小时内的
    $data = Db::name('user')->whereTime('create_time', '-2 hours')->select();
    return json($data);
    
  2. 查询当前时间(此时此刻)在两个时间字段范围,比如开通的会员在当前时间是否到期间
    $data = Db::name('user')->whereBetweenTimeField('create_time', 'update_time')->select();
    return json($data);
    

五.聚合查询

码云提交编号:685345920893f08872b60d94b200f4de937ad82e

  1. 使用 count()方法,可以求出所查询数据的数量
    $data = Db::name('user')->count();
    return json($data);

  2. count()可设置指定 id,比如有空值(Null)id,不会计算数量
    $data = Db::name('user')->count('id');
    return json($data);

  3. 使用 max()方法,求出所查询数据字段的最大值
    $data = Db::name('user')->max('id');
    return json($data);

  4. 如果 max()方法,求出的值不是数值,则通过第二参数强制转换
    $data = Db::name('user')->max('remarks',false);
    return json($data);

  5. 使用 min()方法,求出所查询数据字段的最小值,也可以强制转换
    $data = Db::name('user')->min('id',false);
    return json($data);

  6. 使用 avg()方法,求出所查询数据字段的平均值
    $data = Db::name('user')->avg('id');
    return json($data);

  7. 使用 sum()方法,求出所查询数据字段的总和
    $data = Db::name('user')->sum('id');
    return json($data);

六.子查询

  1. 开始之前先整一些关联数据
    DROP TABLE IF EXISTS `tp_member`;
    
    CREATE TABLE `tp_member` (
      `uid` int(111) NOT NULL COMMENT '用户id',
      `grade` char(15) COLLATE utf8_unicode_ci NOT NULL COMMENT '会员等级',
      `balance` int(10) NOT NULL COMMENT '账户余额',
      PRIMARY KEY (`uid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    /*Data for the table `tp_member` */
    
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (1,'vip',100);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (3,'svip',4);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (8,'vip',454);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (10,'svip',57);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (12,'svip',242);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (5,'vip',723);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (7,'svip',7737);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (15,'vip',57570);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (20,'svip',177);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (9,'svip',22);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (16,'vip',7213);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (17,'svip',777);
    insert  into `tp_member`(`uid`,`grade`,`balance`) values (18,'vip',5770);
    

  2. 使用 fetchSql()方法,可以设置不执行 SQL,而返回 SQL 语句,默认 true
    $data = Db::name('user')->fetchSql(true)->select();
    return $data;

  3. 使用 buildSql()方法,也是返回 SQL 语句,不需要再执行 select(),且有括号
    $data = Db::name('user')->buildSql(true);
    return $data;
    

  4. 结合以上方法,我们实现一个子查询;

    如图

     

    表二是表一的会员信息,现要求查出会员等级为svip的用户

    $query = Db::name('member')->field('uid')->where('grade','svip')->buildSql(true);
    //sql:( SELECT `uid` FROM `tp_member` WHERE `grade` = 'svip' )
    $data  = Db::name('user')->where('id','exp','in'.$query)->select();
    //sql:SELECT * FROM `tp_user` WHERE ( `id` in( SELECT `uid` FROM `tp_member` WHERE `grade` = 'svip' ) )
    //return Db::getLastSql();
    return json($data);

  5. 使用闭包的方式查询
    $data = Db::name('user')
        ->where('id', 'in', function ($query) {
             $query->name('member')->where('grade','svip')->field('uid');
         })
        ->select();
    //return Db::getLastSql();
    return json($data);

七.原生查询

  1. 使用 query()方法,进行原生 SQL 查询,适用于读取操作,SQL 错误返回 false
            $data = Db::query('select * from tp_user');
            return json($data);

  2. 使用 execute 方法,进行原生 SQL 更新写入等,SQL 错误返回 false
    Db::execute('update tp_user set username="小王子" where id=21');

举报

相关推荐

0 条评论