# 模型基类之模型基类的用途 [TOC] >[danger] model的基类的功能相对控制器少一些,但代码量及重要性不容小视 ## 数据处理在程序开发中最至关重要的 如果我们把所有的数据处理 逻辑处理统统统一在模型类中,那么你的程序核心就是可以说模型 >[info] 除了每张表建立一个物理模型 你也可以建立服务和逻辑层 既然model重要,那我我们把更多的复用的代码封装在基类中 增加开发速度 同时高质量的基类代码 也可以减少bug的出现概率 ## 模型事件功能在model里的使用 举一个实例: Model事件实战应用—数据库操作日志 https://www.kancloud.cn/mikkle/thinkphp5_study/347954 这只是一个最简单的模型事件操作,后面的课程中还会介绍自动更新缓存的功能 ## 模型基类的建立 * 在base模块下 建立一个model 文件夹 * 在文件夹下新建文件Base.php * 在文件中设置为抽象类 abstract (推荐) 并继承TP5 Model类 ~~~ /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017/4/14 * Time: 16:23 */ namespace app\base\model; use think\Model; abstract class Base extends Model { } ~~~ 这样 Model 的基类就建立完成了 ## 基类也是可以分成的 >[info] 比如说使用乐观锁的基类可以作为一个独立的二级基类 > 这个基类BaseLeGuan继承Base类 那这个基类封装的代码就更丰富了 > 对数据敏感的数据物理模型继承 BaseLeGuan 即可使用所有相关乐观锁的基类代码了 ~~~ <?php /** * Created by PhpStorm. * Power By Mikkle * Email:776329498@qq.com * Date: 2017/4/19 * Time: 9:24 */ namespace app\base\model; use think\Db; use think\Debug; use think\Error; use think\Exception; use think\Log; use think\Session; abstract class BaseLeGuan extends Base { protected $versionField="edit_version"; /** * 带有乐观锁的修改 * Power: Mikkle * Email:776329498@qq.com * @param $save_data   修改的数据 * @param string $edit_pk 修改的ID字段名称 * @param string $version_field  乐观锁版本号字段名称 * @return array */ public function editDateWithLock($save_data,$edit_pk="",$version_field=""){ if (empty($version_field)){ $version_field = isset($this->versionField) ? $this->versionField : "edit_version"; } if (empty($edit_pk)){ $edit_pk = isset($this->editPk) ? $this->editPk : $this->getPk(); } //判断PK字段是否存在 if (!isset($save_data[$edit_pk])||!isset($save_data[$version_field])){ return self::showReturnCodeWithOutData(1003,"参数缺失"); }else{ $map[$edit_pk] = $save_data[$edit_pk]; $map[$version_field] = $save_data[$version_field]; //剔除PK unset($save_data[$edit_pk]); } try{ //检测版本字段 if($this->hasColumn($version_field)){ throw new Exception("乐观锁版本字段[$version_field]不存在"); } $original_data = $this->where($map)->find(); if (empty($original_data)){ throw new Exception("此条信息已经变动了,请重新操作!"); } foreach ($save_data as $item=>$value){ if (isset($original_data[$item])){ //修改的数值不变时候 剔除 if ($original_data[$item]==$value){ unset( $save_data[$item]); }elseif($item!=$version_field){ unset( $original_data[$item]); } }else{ //修改的字段不存在 剔除 unset( $save_data[$item]); } } if(empty($save_data)){ throw new Exception("修改的数值无变化"); } //版本号升级 $save_data[$version_field]=(int)$original_data[$version_field]+1; if (1!=$this->allowField(true)->save($save_data,$map)){ throw new Exception("修改信息出错:".$this->getError()); } //记录修改日志 $this->saveEditLog($original_data,$save_data); return self::showReturnCodeWithOutData(1001); }catch (Exception $e){ $msg=$e->getMessage(); return self::showReturnCodeWithOutData(1003,$msg); } } /** * 保存修改信息 * Power: Mikkle * Email:776329498@qq.com * @param $original_data * @param $save_data * @return bool */ protected function saveEditLog($original_data,$save_data){ if (empty($original_data)&&empty($save_data)){ $this->error="保存的修改信息不存在"; return false; } $log_data=[ "uuid"=>Session::get('uuid', 'Global'), "model_data"=>$this->name, "original_data"=>$original_data, "save_data"=>$save_data, "update_time"=>time(), ]; try{ Db::table("update_log")->insert($log_data); return true; }catch (Exception $e){ $log_data["error"]="保存修改信息出错"; Log::write(json_encode($log_data),"error"); return false; } } } ~~~