### 慕课网-《快速入门ThinkPHP 5.0--模型篇》学习笔记
[https://www.imooc.com/learn/854](https://www.imooc.com/learn/854)
*****
# 数据库的连接操作
**数据库配置**
> 可在 config/database.php 配置数据库信息
**数据库链接方式**
1. 方法一 (database.php配置法)
```
use think\Db;
$res = Db::connect();
```
2. 方法二 (数组配置法)
```
use think\Db;
$res = Db::connect([
'type' => 'mysql',
'hostname' => 'localhost',
'database' => 'oldyellow',
'username' => 'root',
'password' => 'root',
]);
```
3. 方法三 (DSN配置法)
```
use think\Db;
$res = Db::connect("mysql://root:1234@127.0.0.1:3306/thinkphp#utf8");
```
4. 方法四 (数据库配置文件中自定义配置文件)
```
'db_config1' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '192.168.1.8',
// 数据库名
'database' => 'db_config1',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '1234',
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
],
//数据库配置2
'db_config2' => 'mysql://root:1234@192.168.1.10:3306/db_config2#utf8',
```
```
use think\Db;
$res = Db::connect('db_config1');
```
*****
# 数据库查询操作
**数据库链接方式**
1. Db类
```
use think\Db;
Db::table('tp_user')->find();
// name 可省略前缀
Db::name('user')->find();
```
2. db助手函数
无需引入Db类,同样可省略前缀
```
// 每次都数据库实例化
db('user')->find();
```
**数据查询**
- select 多条数据 没回返回空数组
```
Db::name('user')->select();
```
- column 多条数据 没回返回空数组 必须有参数 参数是表字段名
```
Db::name('user')->column('username');
```
- find 一条最小(旧)数据 没回返回NULL
```
Db::name('user')->find();
```
- value 一条最小(旧)数据值 没回返回NULL 必须有参数 参数是表字段名
```
Db::name('user')->value();
```
*****
# 添加数据
> 表链接可以定义给一个变量
```
$db = Db::name('user');
```
1. insert 返回值是影响记录的行数
```
$res = $db->insert([
'username'=>'oy',
'password'=>md5('oyoyoy'),
'email'=>'oy@qq.com'
]);
dump($res);
```
2. insertGetId 返回值是添加数据的id
```
// 参数内容一样
```
3. insertAll 多条数据添加 返回值是成功插入行数
```
$data = [];
$res = $db->insertAll($data);
dump($res);
```
*****
# 数据库更新操作
数据更新都需要 **where** 条件,返回的都是影响行数
> 同上便于使用,表链接可以定义给一个变量
```
$db = Db::name('user');
```
1. update 适合多条数据更新
```
$res = $db->where([
'id' => 1
])->update([
'username' => 'oy111111',
'email' => 'oy@qq.com111111'
]);
```
2. setField 适合只更新一个字段
```
$res = $db->where([
'id' => 1
])->setField('username','oy222222');
```
3. setInc 自增一,第二个参数设置自增数量
```
$res = $db->where([
'id' => 1
])->setInc('num');
```
```
// 自增5
setInc('num',5);
```
4. setDec 自减一,第二个参数设置自减数量
```
$res = $db->where([
'id' => 1
])->setDec('num');
```
```
// 自减5
setDec('num',5);
```
*****
# 数据库删除操作
同样,删除数据也都需要 **where** 条件,返回的是删除的行数
删除方法就一种 delete
```
$db = Db::name('user');
$res = $db->where([
'id' => 6
])->delete();
```
如果删除是条件是 id 主键
```
$res = $db->delete(5);
```
删除全部数据(**禁止在生产环境使用!**)
```
$res = $db->where("1=1")->delete();
```
*****
# 条件构造器
> buildSql() 返回 sql 语句,适合调试查看
```
$res = $db->where([
'id' => 1
])->buildSql();
```
这四个结果是一样的
```
$res = $db->where(['id' => 1])->select();
$res = $db->where('id',1)->select();
$res = $db->where('id=1')->select();
$res = $db->whereId(1)->select();
```
**条件查询**
> where('字段名','表达式','查询条件');
表达式:[https://www.kancloud.cn/manual/thinkphp5_1/354004](https://www.kancloud.cn/manual/thinkphp5_1/354004)
- 一般查询
```
where('id','=','1')
```
- AND查询
```
->where('id','=','1')
->where('name','=','oy')
```
- OR查询
```
->where('id','=','1')
->whereOr('name','=','oy')
```
- 自定义查询 EXP
```
$db\->where('id','EXP','IN(1,2,3)')->buildSql()
```
输出
```
( SELECT * FROM `tp_user` WHERE ( `id` IN(1,2,3) ) )
```
*****
# 链式操作
> Db类的链式方法会返回一个Db类,我们可以对他继续使用Db链式方法
链式操作:[https://www.kancloud.cn/manual/thinkphp5_1/354005](https://www.kancloud.cn/manual/thinkphp5_1/354005)
```
$res = Db::name('user')
->where('id', '>', 2)
->field('username, id')
->order('id DESC')
->select();
dump($res);
```
其实类似 gulp 中的 pipe 管道
*****