1.TP6文档-数据库学习
记录一些文档里,容易忽略的知识。
(1)游标查询
如果你需要处理大量的数据,可以使用新版提供的游标查询功能,该查询方式利用了PHP的生成器特性,可以大幅减少大量数据查询的内存开销问题。
$cursor = Db::table('user')->where('status', 1)->cursor(); foreach($cursor as $user){ echo $user['name']; }
cursor方法返回的是一个生成器对象,user变量是数据表的一条数据(数组)。
(2)时间查询
使用whereTime方法
// 时间区间查询 Db::name('user') ->whereTime('birthday', 'between', ['1970-10-1', '2000-10-1']) ->select(); // 不在某个时间区间 Db::name('user') ->whereTime('birthday', 'not between', ['1970-10-1', '2000-10-1']) ->select();
// 查询两个小时内的博客
Db::name('blog')
->whereTime('create_time','-2 hours')
->select();
查询某个时间区间
// 查询2017年上半年注册的用户 Db::name('user') ->whereBetweenTime('create_time', '2017-01-01', '2017-06-30') ->select(); // 查询不是2017年上半年注册的用户 Db::name('user') ->whereNotBetweenTime('create_time', '2017-01-01', '2017-06-30') ->select();
查询某年
//查询今年注册的用户
Db::name('user') ->whereYear('create_time') ->select();
//查询去年注册的用户
Db::name('user')
->whereYear('create_time', 'last year')
->select();
//查询某一年的数据使用
// 查询2018年注册的用户
Db::name('user')
->whereYear('create_time', '2018')
->select();
查询某月
//查询本月注册的用户 Db::name('user') ->whereMonth('create_time') ->select();
//查询上月注册用户 Db::name('user') ->whereMonth('create_time','last month') ->select();
//查询2018年6月注册的用户 Db::name('user') ->whereMonth('create_time', '2018-06') ->select();
查询某周
//查询本周数据 Db::name('user') ->whereWeek('create_time') ->select(); //查询上周数据 Db::name('user') ->whereWeek('create_time', 'last week') ->select(); //查询指定某天开始的一周数据 // 查询2019-1-1到2019-1-7的注册用户 Db::name('user') ->whereWeek('create_time', '2019-1-1') ->select();
查询某天
//查询当天注册的用户 Db::name('user') ->whereDay('create_time') ->select();
//查询昨天注册的用户 Db::name('user') ->whereDay('create_time', 'yesterday') ->select();
//查询某天的数据使用 // 查询2018年6月1日注册的用户 Db::name('user') ->whereDay('create_time', '2018-06-01') ->select();
时间字段区间比较
//可以支持对两个时间字段的区间比较 // 查询有效期内的活动 Db::name('event') ->whereBetweenTimeField('start_time', 'end_time') ->select(); 上面的查询相当于 // 查询有效期内的活动 Db::name('event') ->whereTime('start_time', '<=', time()) ->whereTime('end_time', '>=', time()) ->select();
自定义时间查询规则
//自定义时间查询规则 //你可以通过在数据库配置文件中设置time_query_rule添加自定义的时间查询规则, 'time_query_rule' => [ 'hour' => ['1 hour ago', 'now'], ],
(3) 高级查询
查询表达式:
| EXP | 表达式查询,支持SQL语法 | whereExp |
| find in set | FIND_IN_SET查询 | whereFindInSet |
支持更复杂的查询情况 例如: Db::name('user')->where('id','in','1,3,8')->select(); 可以改成: Db::name('user')->where('id','exp',' IN (1,3,8) ')->select(); exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。 推荐使用whereExp方法查询 Db::name('user')->whereExp('id', 'IN (1,3,8) ')->select();
快捷方法
whereExists |
EXISTS条件查询 |
whereNotExists |
NOT EXISTS条件查询 |
whereExp |
表达式查询 |
whereColumn |
比较两个字段 |
下面举例说明下两个字段比较的查询条件whereColumn方法的用法。 查询update_time大于create_time的用户数据 Db::table('think_user') ->whereColumn('update_time','>','create_time') ->select(); 生成的SQL语句是: SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` ) 查询name和nickname相同的用户数据 Db::table('think_user') ->whereColumn('name','=','nickname') ->select(); 生成的SQL语句是: SELECT * FROM `think_user` WHERE ( `name` = `nickname` ) 相同字段条件也可以简化为 Db::table('think_user') ->whereColumn('name','nickname') ->select(); 支持数组方式比较多个字段 Db::name('user')->whereColumn([ ['title', '=', 'name'], ['update_time', '>=', 'create_time'], ])->select(); 生成的SQL语句是: SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` )
(4) JSON字段
如果你的user表有一个info字段是JSON类型的(或者说你存储的是JSON格式,但并非是要JSON字段类型),你可以使用下面的方式操作数据。 JSON数据写入 $user['name'] = 'thinkphp'; $user['info'] = [ 'email' => 'thinkphp@qq.com', 'nickname' => '流年', ]; Db::name('user') ->json(['info']) ->insert($user);
JSON数据查询 查询整个JSON数据: $user = Db::name('user') ->json(['info']) ->find(1); dump($user); 查询条件为JSON数据 $user = Db::name('user') ->json(['info']) ->where('info->nickname','ThinkPHP') ->find(); dump($user); 由于JSON字段的属性类型并不会自动获取,所以,如果是整型数据查询的话,可以设置JSON字段类型,例如: $user = Db::name('user') ->json(['info']) ->where('info->user_id', 10) ->setFieldType(['info->user_id' => 'int']) ->find(); dump($user); JSON数据更新 完整JSON数据更新 $data['info'] = [ 'email' => 'kancloud@qq.com', 'nickname' => 'kancloud', ]; Db::name('user') ->json(['info']) ->where('id',1) ->update($data); 单个JSON数据更新 $data['info->nickname'] = 'ThinkPHP'; Db::name('user') ->json(['info']) ->where('id',1) ->update($data);