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