🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 什么是模型 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); ``` *****