ThinkPHP6.0
【ThinkPHP6.x / PHP框架】【十天精品课堂系列】83P
https://www.bilibili.com/video/BV12E411y7u8
文档《ThinkPHP6.0完全开发手册》
https://www.kancloud.cn/manual/thinkphp6_0/1037479
课程讲义SQL下载:
链接:https://pan.baidu.com/s/16a6yM-IoGTR7QoAlq9zyZw
提取码:7y9t
李炎恢tp6教程文档
https://www.wodecun.com/blog/8137.html
1、环境要求
1、PHP >= 7.1
2、Composer
# 安装 curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer # 国内镜像(阿里云) composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2、创建项目
# 创建项目 tp为项目文件夹名 composer create-project topthink/think tp # 开发环境运行[端口号] php think run [-p 80]
配置
// 读取环境变量 .env配置 use think\facade\Env; Env::get('database.hostname'); // 读取配置 use think\facade\Config; Config::get('database.connections.mysql.hostname');
URL
单应用模式
http://serverName/index.php/控制器/操作[/参数名/参数值...]
多应用模式
http://serverName/index.php/应用/控制器/操作[/参数名/参数值...]
兼容模式
http://serverName/index.php?s=/控制器/操作[/参数名/参数值...]
控制器
启动控制器后缀
config/route.php
// 是否使用控制器后缀 'controller_suffix' => true,
中断测试, 使用助手函数
halt()
控制器数据返回
// 字符串 return 'hello world'; // json return json(['name' => 'Tom']); // 渲染模板 return view('test/index', ['name' => 'Tom']);
特殊控制器
1、 基础控制器 BaseController 提供了$app $request
2、 空控制器 ErrorController 控制器不存在会调用
3、 多级控制器 /user.blog -> controller/user/BlogController.php
数据库配置和Model
数据库配置文件 config/database.php
Model定义
use think\Model; class ArticleModel extends Model { // 真实的表名 protected $name = 'tb_article'; }
数据查询
use think\facade\Db; // 查询一条数据 $result = Db::table('tb_user')->where('id', '=', 1)->find(); // 获取最后一条查询语句 $sql = Db::getLastSql(); // SELECT * FROM `tb_user` WHERE `id` = 1 LIMIT 1
1、单条数据查询
查询方法 数据不存在的返回值 find() -> null findOrFail() -> 抛出异常 findOrEmpty() -> 返回空数组 array()
2、数据集查询
查询方法 数据不存在的返回值 select() -> 返回空数组 array() selectOrFail() -> 抛出异常
数据集可以转为数组 toArray()
// 需要传入完整表名 Db::table('tb_user') // 需要省略表前缀 Db::name('user') // 返回指定的值 value('username') // 返回键值对 [key => value] column('value', 'key') // 分批读取数据 chunk() // 游标查询,每次读取一条数据 cursor()
链式查询
// query对象可进行多次查询 $query = Db::table('tb_user'); $query->where('id', '=', 1)->select(); // SELECT * FROM `tb_user` WHERE `id` = 1 // 继续使用同一个查询对象,会保留上一次的查询条件 $query->select(); // SELECT * FROM `tb_user` WHERE `id` = 1 // 查询之前清空where条件 $query->removeOption('where')->select(); // SELECT * FROM `tb_user`
新增数据
新增一条数据
// 1、插入数据 返回插入成功数量 Db::table('tb_user')->insert($data); // 2、抛弃不存在的数据 $data = [ 'name'=> 'Jack', // 不存在name字段 'username'=> 'Jack', ]; Db::table('tb_user')->strict(false)->insert($data); // INSERT INTO `tb_user` SET `username` = 'Jack' // 3、replace into $data = [ 'username' => 'Tom', ]; Db::table('tb_user')->replace()->insert($data); // REPLACE INTO `tb_user` SET `username` = 'Tom' // 4、插入数据后返回自增ID $data = [ 'username'=> 'Jack', ]; $result = Db::table('tb_user')->insertGetId($data);
批量新增
$data = [ ['foo' => 'bar', 'bar' => 'foo'], ['foo' => 'bar1', 'bar' => 'foo1'], ['foo' => 'bar2', 'bar' => 'foo2'] ]; Db::name('user')->insertAll($data); // replace Db::name('user')->replace()->insertAll($data); // 分批插入 Db::name('user') ->limit(100) ->insertAll($data);
save新增,自动判断新增还是更新
Db::name('user') ->save(['id' => 1, 'name' => 'thinkphp']);
修改数据
// update Db::name('user') ->where('id', 1) ->update(['name' => 'thinkphp']); // UPDATE `think_user` SET `name`='thinkphp' WHERE `id` = 1 // save Db::name('user') ->save(['id' => 1, 'name' => 'thinkphp']); // UPDATE `think_user` SET `name`='thinkphp' WHERE `id` = 1 // 使用SQL函数 Db::name('user') ->where('id',1) ->exp('name','UPPER(name)') ->update(); // UPDATE `think_user` SET `name` = UPPER(name) WHERE `id` = 1 // 自增/自减 Db::table('think_user') ->where('id', 1) ->inc('score') ->update(); // UPDATE `think_user` SET `score` = `score` + 1 WHERE `id` = 1 // raw方法 Db::name('user') ->where('id', 1) ->update([ 'name' => Db::raw('UPPER(name)'), 'score' => Db::raw('score-3'), 'read_time' => Db::raw('read_time+1') ]);
删除数据
// 根据主键删除 Db::table('think_user')->delete(1); // DELETE FROM `think_user` WHERE `id` = 1 Db::table('think_user')->delete([1,2,3]); // DELETE FROM `think_user` WHERE `id` IN (1,2,3) // 条件删除 Db::table('think_user')->where('id',1)->delete(); // DELETE FROM `think_user` WHERE `id` = 1 Db::table('think_user')->where('id','<',10)->delete(); // DELETE FROM `think_user` WHERE `id` < 10 // 删除所有数据 Db::name('user')->delete(true); // DELETE FROM `think_user`
查询方式
比较查询
where('字段名','查询表达式','查询条件');
区间查询
// Like Db::name('user')->whereLike('name','thinkphp%')->select(); Db::name('user')->whereNotLike('name','thinkphp%')->select(); // Between Db::name('user')->whereBetween('id','1,8')->select(); Db::name('user')->whereNotBetween('id','1,8')->select(); // Null Db::name('user')->whereNull('name')->select(); Db::name('user')->whereNotNull('name')->select(); // In Db::name('user')->whereIn('id','1,5,8')->select(); Db::name('user')->whereNotIn('id','1,5,8')->select();
自定义查询
// Exp Db::name('user')->whereExp('id', 'IN (1,3,8) ')->select();
时间查询
传统查询
// 大于某个时间 Db::table('tb_user') ->where('create_time', '>=', '1970-10-1') ->select(); // SELECT * FROM `tb_user` WHERE `create_time` >= '1970-10-1'
快捷查询
// 大于某个时间 Db::table('tb_user') ->whereTime('create_time', '>=', '1970-10-1') ->select(); // SELECT * FROM `tb_user` WHERE `create_time` >= '1970-10-01 00:00:00' Db::table('tb_user') ->whereBetweenTime('create_time', '2017-01-01', '2017-06-30') ->select(); // SELECT * FROM `tb_user` // WHERE `create_time` BETWEEN '2017-01-01 00:00:00' AND '2017-06-30 00:00:00'
固定查询
Db::table('tb_user') ->whereYear('create_time', 'last year') ->select(); // SELECT * FROM `tb_user` // WHERE `create_time` BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59' Db::table('tb_user') ->whereMonth('create_time', 'last month') ->select(); // SELECT * FROM `tb_user` WHERE `create_time` // BETWEEN '2021-05-01 00:00:00' AND '2021-05-31' Db::table('tb_user') ->whereWeek('create_time', 'last week') ->select(); // SELECT * FROM `tb_user` // WHERE `create_time` BETWEEN '2021-05-31 00:00:00' AND '2021-06-06 23:59:59' Db::table('tb_user') ->whereDay('create_time', 'yesterday') ->select(); // SELECT * FROM `tb_user` // WHERE `create_time` BETWEEN '2021-06-12 00:00:00' AND '2021-06-12 23:59:59'
其他查询
// 查询两个小时内的博客 Db::name('tb_user') ->whereTime('create_time','-2 hours') ->select(); // SELECT * FROM `tb_user` WHERE `create_time` >= '2021-06-13 14:23:25' // 查询有效期内的活动 Db::table('tb_user') ->whereTime('start_time', '<=', time()) ->whereTime('end_time', '>=', time()) ->select(); // SELECT * FROM `tb_user` // WHERE `start_time` <= '2021-06-13 16:18:43' AND `end_time` >= '1623572323'
聚合、原生、子查询
聚合查询
// 统计数量 Db::table('tb_user')->count(); // SELECT COUNT(*) AS think_count FROM `tb_user` // 获取最大值 Db::table('tb_user')->max('id'); // SELECT MAX(`id`) AS think_max FROM `tb_user` // 获取最小值 Db::table('tb_user')->min('id'); // SELECT MIN(`id`) AS think_min FROM `tb_user` // 获取平均值 Db::table('tb_user')->avg('id'); // SELECT AVG(`id`) AS think_avg FROM `tb_user` // 获取总分 Db::table('tb_user')->sum('id'); // SELECT SUM(`id`) AS think_sum FROM `tb_user`
SQL构建
// 直接返回SQL而不是执行查询 Db::table('tb_user')->fetchSql()->select(); // SELECT * FROM `tb_user` // 返回SQL,可以带括号 Db::table('tb_user')->buildSql(); ( SELECT * FROM `tb_user` )
子查询
// 手动拼接 $subQuery = Db::table('tb_user')->where('id', '>', 5)->buildSql(); $sql = Db::table('tb_user')->where('id', 'exp', 'IN' . $subQuery)->select(); // SELECT * FROM `tb_user` // WHERE ( `id` IN( SELECT `id` FROM `tb_user` WHERE `id` > 5 ) ) // 使用闭包 Db::table('tb_user')->where('id', 'in', function ($query){ $query->table('tb_user')->field('id')->where('id', '>', 5); })->select(); // SELECT * FROM `tb_user` WHERE `id` IN (SELECT `id` FROM `tb_user` WHERE `id` > 5)
原生查询
// 查询 Db::query('select * from tb_user'); // 写入 Db::execute('insert into tb_user (name, age) values ("Tom", 23)');
链式查询
where 查询操作
参数支持的变量类型: 字符串、数组、闭包
// 表达式查询(推荐) Db::table('think_user') ->where('id','>',1) ->where('name','thinkphp') ->select(); // 数组条件 Db::table('think_user')->where([ 'name' => 'thinkphp', 'status'=> 1 ])->select(); // 字符串条件 Db::table('think_user') ->whereRaw('type=1 AND status=1') ->select(); // 变量预处理 Db::table('think_user') ->whereRaw("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp']) ->select();
field
// 指定查询字段 Db::table('user')->field('id,title,content')->select(); Db::table('user')->field(['id','title','content'])->select(); // 设置别名 Db::table('user')->field('id,nickname as name')->select(); Db::table('user')->field(['id','nickname'=>'name'])->select(); // 使用函数 Db::table('user')->fieldRaw('id,SUM(score)')->select(); // 获取所有字段,两者等价 Db::table('user')->field('*')->select(); Db::table('user')->select(); // 字段排除 Db::table('user')->withoutField('user_id,content')->select(); Db::table('user')->withoutField(['user_id','content'])->select(); // 字段合法性检测 Db::table('user')->field('title,email,content')->insert($data);
alias 设置数据表别名
Db::table('think_user') ->alias('a') ->select();
limit
// limit Db::name('user')->limit(5)->select(); // offset limit Db::name('user')->limit(1, 5)->select();
page 分页
// page, limit Db::name('user')->page(1, 5)->select();
order
Db::name('user')->order('id', 'desc')->select(); Db::name('user')->order(['create_time'=>'desc', 'price'=>'asc'])->select(); Db::name('user')->orderRaw('FIELD(username,"Tom") DESC')->select();
group
Db::name('user') ->fieldRaw('gender, SUM(price)') ->group('gender') ->select();
having
Db::name('user') ->fieldRaw('gender, SUM(price)') ->group('gender') ->having('SUM(price)>600') ->select();
高级查询
// |OR &AND Db::table('tb_user') ->where('username|nick_name', 'like', '%高%') ->where('id&age', '>', 12) ->select(); // SELECT * FROM `tb_user` // WHERE ( `username` LIKE '%高%' OR `nick_name` LIKE '%高%' ) // AND ( `id` > 12 AND `age` > '12' ) // 关联数组原样查询条件 Db::table('tb_user') ->where([ ['username', 'like', '%王%'], ['age', 'exp', Db::raw('>18')], ]) // SELECT * FROM `tb_user` // WHERE `username` LIKE '%王%' AND ( `age` >18 ) // 条件优先级,增加一个中括号 $data = [ ['username', 'like', '%王%'], ['age', 'exp', Db::raw('>18')], ]; $sql = Db::table('tb_user') ->where([$data]) ->where('id', '>', 1) // SELECT * FROM `tb_user` // WHERE ( `username` LIKE '%王%' AND ( `age` >18 ) ) // AND `id` > 10 // 多组条件查询 $data1 = [ ['username', 'like', '%王%'], ['age', 'exp', Db::raw('>18')], ]; $data2 = [ ['username', 'like', '%孙%'], ['age', '>', 18], ]; $sql = Db::table('tb_user')->whereOr([$data1, $data2]) // SELECT * FROM `tb_user` // WHERE ( `username` LIKE '%王%' AND ( `age` >18 ) ) // OR ( `username` LIKE '%孙%' AND `age` > '18' ) // 闭包查询 Db::table('tb_user') ->where(function ($query){ $query->where('id', '>', 1); }) // SELECT * FROM `tb_user` WHERE ( `id` > 1 ) // 原样sql查询条件和参数绑定 Db::table('tb_user')->whereRaw('id > ?', [12]) Db::table('tb_user')->whereRaw('id > :id', ['id' => 12]) // SELECT * FROM `tb_user` WHERE ( id > '12' )
快捷查询
Db::table('tb_user') ->whereColumn('create_time', '>', 'update_time') // SELECT * FROM `tb_user` WHERE ( `create_time` > `update_time` )
事务和获取器
事务
// 自动处理,出错自动回滚; Db::transaction(function () { Db::name('user')->where('id', 19)->save(['price'=>Db::raw('price - 3')]); Db::name('user1')->where('id', 20)->save(['price'=>Db::raw('price + 3')]); }); // 手动处理 //启动事务 Db::startTrans(); try { Db::name('user')->where('id', 19)->save(['price'=>Db::raw('price - 3')]); Db::name('user1')->where('id', 20)->save(['price'=>Db::raw('price + 3')]); //提交事务 Db::commit(); } catch (\Exception $e) { echo '执行 SQL 失败!'; //回滚 Db::rollback(); }
获取器
Db::name('user')->withAttr('email', function ($value, $data) { return strtoupper($value); })->select();
数据集和代码提示
1、TP6.0 编辑器没有代码提示问题解决
将TP5.1的代码注释复制过来即可
TP5.1 think\Db TP6.0 think\facade\Db
2、数据集Collection对象