一、数据库连接
i. 使用应用配置文件 conf/config.php
1. app目录同级 新建conf/database.php
2. 使配置文件生效 入口文件配置路径(入口文件 安全检测|过滤请求|定义常量)
3. config()助手函数 打印数据库信息测试
4. 上述访问路径 可在Apache(或其他服务器)配置文件中配置虚拟域名 指定根目录等等简化 详情参见【配置篇】
ii. Db::connect()|Db::connect([‘’=>’’,...])
1. use think\Db ; Db::connect() ;
或者是 $res = Db::connect(); dump($res) ;打印出东西 不代表连接上了数据库
2. Db::connect([‘’=>’’,...]); 接受参数 数组类型 即database.php里面的配置
此处 仅仅是打印出 配置的连接信息而已......
3. Db::connect(“”); 传入参数 字符串类型 即dsn配置mysql://root:@127.0.0.1:3306/test#utf8
或者
传入的参数必须在conf/config.php中配置 并且以此参数为key的value值 同database.php 配置的’database’=>[‘’=>’’,...] 数据库信息
iii. 数据库查询操作
1. 原生sql
a) Db::query($sql) //直接传入sql语句
b) Db::execute(‘’,[])//写操作(增|删|改) 两个参数:sql语句 ,传入数组类型绑定的参数
2. Db::table(‘test_user’)->select(); 查询所有 返回值是二维数组
3. Db::table('test_user')->where('id','>','3')->select() ; //where条件 查询部分
4. Db::table('test_user')->find(); 查询一条记录 不加where条件 默认返回第一条 查询不到结果返回 NULL
5. Db::table('test_user')->value('userName') ; 查询一条记录 返回某个字段的值 查询的记录不存在 返回NULL
6. Db::table('test_user')->column('userName'); 返回某一列的值 一维数组
a) 传入一个参数
b) 传入第二个参数 返回一维数组 key[第二个参数]=>value[第一个参数] 若记录不存在 则返回空数组
7. Db::name('user');//不用传入表前缀 (已经在配置文件中配置了表前缀)
8. 助手函数db(‘user’)不需要传入表前缀
a) Db::name(‘user’); 单例模式 需要引入 user think\Db
b) 助手函数db()每次调用实例化一次 传递第三个参数 不会重新实例化 db(‘user’,[],false)
iv. 数据库添加
1. insert([]) 默认返回值是影响记录行数
2. insertGetId([]) 返回添加成功后 新增记录的id
3. insertAll([]) 批量添加数据 返回影响行数
v. 数据库更新
1. update([]) 返回影响行数 UD操作 传入id
也可以 ->where([‘id’=>XXX])
2. setField('userName','ceshi45')修改一个字段的值 返回影响行数
3. setInc(‘num’,3); num字段每次增加3 第二个参数不传 默认一次自增1 返回影响行数
4. setDec(‘num’,3); 同上自减
vi. 数据删除
1. delete() 删除条件 返回影响行数
2. 如上 如果按照 id删除 id又是表里面的主键
可以直接$db->delete(2);
3. 删除所有 $db->where(“1=1”)->delete() ;
vii. 条件构造器
1. buildSql()返回当前sql语句
2. where(‘’,’’,’’)字段 条件 值(字符串类型 或者数组类型【between|in 需要传入范围】)
3. where([]) 默认是’’=>’’ key=value ‘’=>[‘条件’,’’]
4. where('id','EXP','in(1,5)')
5. 多个where AND
6. 多个where OR
viii. 链式操作
1. ->field("typeName,id,title,ctime") //限定查询的列
2. ->order("id desc") //按照id降序
3. ->limit(0,5)->select() ; //查询5条数据
4. 用limit分页的时候 limit((当前页-1)*每页显示条数,每页显示条数)
page(当前页,每页显示条数)
5. group("`pid`")
二、模型
i. 模型(model)文件定义
1. app\模块\model\文件名.php 文件名与表名对应(去掉表前缀) 遵循驼峰命名法
表名:test_user -->User test_type_info --->TypeInfo
2. 引入model测试
3. 实例化 $user = new User ; $res = $user::get(21) ;
4. 需要用到多个模型的时候 Loader::model('User') ;
5. model(‘’) 助手函数 加载model类 有可能会被覆盖
ii. 模型查询
1. get()
a) 传主键 get(21)
b) 传查询条件 闭包函数
User::get(function($query) {
$query->where('id','20') ;
}) ;
2. find()条件 取一条记录
3. all() 获取多条数据 不传参数 查询所有 传入参数’1,2,3’主键 或者[1,2,3] 或者是闭包函数
4. 查询单个字段的值 value(‘’)
5. 获取一列的值 column(‘value’,’key’) 用法同上
iii. 使用模型添加数据
1. create([],true) 第二个参数 过滤掉无效字段 将第二个参数传为数组[‘name’,’auth’] 则新增数据的时候 只会新增name auth
2. 实例化模型 save()
3. 或者直接save([‘’=>’’,...]) ; 返回影响行数
4. allowField(true)->save([]) ;
5. 批量添加 saveAll([[],[]]) ;
iv. 使用模型更新数据
1. update(['id'=>58 ,
'userName'=>'qazxwsedcrf'
]) ;
传主键
2. update([
'userName'=>'q1111'
],['id'=>58]) ; 第二个参数还可以是闭包函数 用法同上
3. where('id',58)->update(['userName'=>'qwe111111']) ; 返回影响行数 推荐
4. save()
5. save([],[])|save([],function($query){}) 推荐
6. saveAll([[],[]]) 传二维数组 传主键
v. 使用模型删除数据
1. destroy(58) 传主键 返回影响行数
2. destroy(['id'=>57]) ; 传条件 返回影响行数
3. destroy(function($query) {
$query->where('id','>','50') ;
}) ; 闭包函数 传条件 返回影响行数
4. $user->delete() ; 或者User::where(‘id’,’>’,’10’)->delete() 删除所有 where(‘1=1’) 条件永远为真
vi. 模型聚合操作
1. count() 查询总记录数 可加条件 where(‘id’,’>’,’15’)->count()
2. where()->max(‘字段名’)
3. 求和 where()->sum(‘字段名’)
4. 求平均值 where()->avg(‘字段名’)
5. 最小值 where()->min(‘字段名’)
vii. 模型获取器
1. 场景 状态:0|1 存储 展示的时候 开启|关闭
2. model/模型.php 模型文件 public function getAuthAttr() {}
方法名固定: public function get字段名Attr(){}
viii. 模型修改器+自动完成
1. 如 存储密码的时候 自动md5加密
2. model文件 public function setPasswordAttr($val) 第二个参数数组类型 将要新增的记录
3. 控制器新增数据
4. 自动完成
a) 模型文件:
b) 控制器文件新增
ix. 模型时间戳+软删除
1. 时间戳 (添加时间|更新时间) model类提供了配置 自动管理
2. 添加时间|更新时间 默认是create_time update_time
a) conf/database.php 全局配置 若是表里没有create_time|update_time 会报错 不推荐
// 自动写入时间戳字段
'auto_timestamp' => true,
b) Model文件中 protected $autoWriteTimestamp = true ; 新增|更新时自动配置时间戳 (默认是create_time|update_time ) 如果不是 需要指定 如下 需要指定成使用的 create_at|update_at
如果只需要用到一个时间 把另外一个设置为false即可
3. 软删除:给作废的记录打个 不会真正的从数据库删除 标记软删除时间 默认是delete_time
a) delete_time默认是NULL 软删除之后 值是时间戳
b) 使用软删除 model类中 use traits\model\SoftDelete ;
c) 控制器中 destroy()|delete() 执行软删除 软删除之后 用withTrashed(true) 查询被软删除的记录
$res->getData() 获取原始数据
d) 软删除 一般会有垃圾箱|回收站 仅查询全部被软删除的记录 onlyTrashed()
e) 软删除数据恢复 update将delete_time字段设置为NULL
f) 记录软删除 默认是delete_time 可在model类中修改 方法同上
g) 真正将数据库中记录删除 destroy(‘’,true) |delete(true)