# 什么是模型
MVC中的Model,可添加方法,便于重用。
- 新建model
```
模块/model/***.php
```
- 命名规范
表名,并且首字母大写驼峰(不含tp定义的前缀)
例:tp_user 模型名 User.php
例:tp_user_info 模型名 UserInfo.php
- User.php
```
application/index/model/User.php
```
```
namespace app\index\model;
use think\Model;
class User extends Model
{
}
```
**在控制器中使用模型**
1. 引入模型类 静态方法调用(**推荐使用,代码可读性高**)
```
use app\index\model\User;
$res = User::get(1);
```
2.实例化模型类(**静态方法和实例化的区别,了解下**)
```
use app\index\model\User;
$user = new User;
$res = $user::get(1);
```
3. 使用APP(**原Loader 适合同时使用多个模型**)
```
use think\facade\App;
$user = App::model('User');
$res = $user::get(1);
```
4. model助手函数(**最快,但不推荐使用,避免函数冲突**)
```
$user = model('User');
$res = $user::get(1);
```
*****
# 使用模型查询数据
模型专属的方法
- get 同 Db类的find
```
$res = User::get(1);
```
- all 同 Db类的select
```
$res = User::all();
$res = User::all('1,2,3');
```
其他用法基本和Db类一样,也支持链式。
- 获取指定id的单个数据
```
$res = User::where('id',1)->value('email');
```
*****
# 使用模型添加数据
1. create 方法 返回的是数组,第二个参数设置允许写入的字段
```
$res = User::create([
'username'=>'oy',
'password'=>md5('oyoyoy'),
'email'=>'oy@qq.com'
],['username','password','email']);
dump($res);
````
2. save 方法 必须实例化,返回的是布尔值
```
$user = new User;
$res = $user->save([
'username'=>'oy',
'password'=>md5('oyoyoy'),
'email'=>'oy@qq.com'
]);
dump($res);
```
3. 使用allowField方法 设置允许写入字段
```
$res = $user->allowField(['username','email'])->save([
'username'=>'oy',
'password'=>md5('oyoyoy'),
'email'=>'oy@qq.com'
]);
```
4 插入多条数据 saveAll,同样需要实例化
```
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
```
*****
# 使用模型更新数据
1. update 方法 返回影响的数量
```
$res = User::where('id',1)
->update([
'username' => 'oy333',
'email' => 'oy@qq.com333'
]);
```
2. save 方法 必须实例化 返回的是布尔值
```
$userModel = new User;
$res = $userModel->save([
'username' => 'oy666'
],['id' => 1]);
```
*****
# 使用模型删除数据
1. destroy 方法,返回布尔值
```
$res = User::destroy(15);
```
2. delete 方法,返回影响数
```
$res = User::where('id',15)->delete();
```
3. 清空数据(**慎用**)
```
$res = User::where('1=1')->delete();
```
*****
# 模型聚合操作
都可以使用 where 条件内聚合
1. count 数据总条数
```
$res = User::count();
$res = User::where('id','>',3)->count();
```
2. max 某个值最大
```
$res = User::max('id');
```
3. min 某个值最小
```
$res = User::min('id');
```
4. sum 某个值总和
```
$res = User::sum('id');
```
5. avg 某个值平均
```
$res = User::avg('id');
```
*****
# 模型获取器(数据库读取数据后加工显示)
> 对数据库原始字段值进行加工,输出显示可读的文字信息
- model/User.php 模型方法命名规范: get+字段名+Attr
```
public function getSexAttr($val)
{
switch($val){
case '1':
return "男";
break;
case '2':
return "女";
break;
default:
return "未知";
break;
}
}
```
- 控制器中使用,一样
```
use app\index\model\User;
$res = User::get(1);
dump($res->sex);
```
- 获取原始数据
```
dump($res->getData('sex'));
```
*****
# 模型修改器(数据加工后添加到数据库)
- model/User.php 模型方法命名规范: set+字段名+Attr
第二个参数,是获取全部提交的数据,组合密码效果更佳!
```
public function setPasswordAttr($val,$data)
{
// 一般加密
return md5($val);
// 组合加密
return md5($val . $data['email']);
}
```
- 控制器中添加数据代码不变
```
// 代码同略
```
*****
# 自动完成
> 注意:更新数据必须是要 save() 方法,若使用 update() 则无效
```
// 新增和更新都生效
protected $auto = ['time'];
// 新建才生效
protected $insert = ['time_insert'];
// 更新才生效
protected $update = ['time_update'];
public function setTimeAttr()
{
return time();
}
public function setTimeInsertAttr()
{
return time();
}
public function setTimeUpdateAttr()
{
return time();
}
```
*****
# 模型时间戳
> **自动完成**虽然可以实现,但是TP已内置了自动时间功能,更方便。
- 数据库字段必须设置成 create_time 和 update_time
- model/User.php 内开启
```
use think\Model;
class User extends Model
{
protected $autoWriteTimestamp = true;
}
```
- 可关闭某项
```
protected $updateTime = false;
```
# 软删除
> 数据还在,只是被隐藏了
- 数据库字段必须设置成 delete_time 默认 NULL 表示未删除
- 数据库字段必须设置成 delete_time
- model/User.php 内引用并使用软删除类
```
namespace app\index\model;
use think\Model;
use think\model\concern\SoftDelete;
class User extends Model
{
use SoftDelete;
}
```
- 在控制器中软删除
```
$res = User::destroy(1);
```
- 在控制器中查看已软删除的数据
```
$res = User::withTrashed()->find(1);
```
*****