ThinikPhp将数据库模型的增、删、改操作写⼊⽇志Thinkphp中的模型可以对数据库字段进⾏验证规则的设置和设置⼀些字段的默认值(⽐如字段为当前时间)以及在操作数据时的的⼀些回调⽅法等基本上每⼀个模型都需要设置⼀些验证规则和字段默认值的设置,⽽⼤部分都存在着重复的⼯作特别是像需要将数据库操作记录到⽇志系统的,这就导致我们需要在每个模型中反复处理针对此问题我定义⼀个⽗类模型,所以模型都继承⾃此类即可解决以上两个问题⽗类就完成了以下两件⼯作:1. 记录增、删、改等操作到⽇志系统2. 定义⼀些⼤部分数据库都需要验证的规则(⼦类可覆盖或⾃定义)或者需要⾃动⽣成的字段(如每个数据库都有⼀个记录当前时间的字段create_time)<?php/* ** 公共模型*/namespace Common\Model;use Think\Model;class CommonModel extends Model {/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 12:22:19* @Description: 验证字段,⼦类可以覆盖或移出*/protected $_validate = array(array('code','require','{%ERROR_NOT_PAST}'),//必须array('name','require','{%ERROR_NOT_PAST}'),//必须);/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 12:08:38* @Description: 所有继承的⼦类字段create_time⾃动⽣成当前时间*/protected $_auto = array (array ('create_time', 'mGetDate', 1, 'callback' ), // 增加的时候调⽤回调函数);/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 15:52:40* @Description: 返回该类的⾃动验证信息,⽤于在⼦类中合并该验证信息(不能在⼦类中定义此$_validate属性否则会被覆盖,如果不需要在⼦类中合并则可以可忽略此⽅法) */protected function get_validate(){return $this->_validate;}/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 12:06:03* @Description: 获取当前时间*/protected function mGetDate() {return date ( 'Y-m-d H:i:s' );}/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 10:50:20* @Description: 更新成功后的回调⽅法*/protected function _after_update($data,$options) {//区分会员登录和更改操作if( $options['model']=="Users"&& $data['last_login_ip']&& $data['last_login_time']&& count($data)==3){$this->after_write("login",$data,$options);}else{$this->after_write("update",$data,$options);}}/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 10:50:27* @Description: 插⼊成功后的回调⽅法*/protected function _after_insert($data,$options) {$this->after_write("insert",$data,$options);}/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 11:56:12* @Description: 删除成功后的回调⽅法*/protected function _after_delete($data,$options) {$this->after_write("delete",$data,$options);}/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 11:03:18* @Description: 更新或插⼊成功后和删除前写⼊系统⽇志*/function after_write($type,$data,$options){$db_name = C('DB_PREFIX')."system_log"; //⽇志表//如果是系统⽇志表则不处理,防⽌循环调⽤此⽅法if(!$this->_is_array($data) || !$this->_is_array($options) || strcasecmp($options['table'],$db_name)==0) return ; $model = M("SystemLog"); //⽇志表$new_value = json_encode($data);// 去除前缀的表名$_data['log_table'] = str_replace(C('DB_PREFIX'), "",$options['table']);//更改时如果原数据未更改则不进⾏记录,防⽌重复记录if("update" === $type){//表主健$_data['t_id'] = $data['id'];// 主健名称不是id// 获取主健对应的数据if($_data['id']){$tablename = $options['table'];$_data['t_id'] = $data[M($tablename)->getPk()];}// 如果最后⼀条的值没有更改则不记录if($model->where($_data)->order("id desc")->getField("new_value")===$new_value) return;}$_data['log_type'] = $type;$_data['new_value'] = $new_value;$_data['log_user'] = $_SESSION['ADMIN_ID'];$_data['create_time'] = date('Y-m-d H:i:s');$_data['ip_address'] = get_client_ip(0,true);$_data['user_agent'] = $_SERVER['HTTP_USER_AGENT'];try {$model->add($_data);} catch (Exception $e) {\Think\Log::write('写⼊系统⽇志时发⽣错误,错误信息:'.$e->getMessage(),'WARN');}}/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 11:04:40* @Description: 是否是数组*/function _is_array($array){return ($array && is_array($array) && count($array)>0);}}定义⼀个数据库模型并继承⾃CommonModel即可<?php/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 12:03:57* @Description: 基础价格Model*/namespace Common\Model;use Common\Model\CommonModel;class PriceModel extends CommonModel{/*** @Author: HTL* @Email: Huangyuan413026@* @DateTime: 2016-04-08 15:01:46* @Description: ⾃动验证,合并⽗类验证规则*/function _initialize() {//⾃定义验证规则$_val = array(array('cost','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),array('price','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),);//合并⽗类的规则//验证⽗类code、name字段//当前模型的create_time字段⾃动填充$this->_validate = array_merge (parent::get_validate(),$_val);// 移出⽗类的Code唯⼀性验证//foreach ($this->_validate as $key => $value) {// if($value[0]=='code' && $value[4]=='unique'){// unset($this->_validate[$key]);// }//}//覆盖⽗类验证规则$this->_validate = $_val;}}数据库结构CREATE TABLE `tp_system_log` (`id` INT(11) NOT NULL AUTO_INCREMENT,`log_type` VARCHAR(50) NOT NULL COMMENT '操作类别',`log_table` VARCHAR(100) NOT NULL COMMENT '操作的表',`log_user` VARCHAR(100) NOT NULL COMMENT '操作的⽤户',`t_id` VARCHAR(50) NOT NULL COMMENT '操作的表的主健ID',`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作的时间', `new_value` TEXT NOT NULL COMMENT '操作后的新值',`ip_address` VARCHAR(20) NOT NULL COMMENT 'Ip地址',`user_agent` VARCHAR(500) NULL DEFAULT NULL COMMENT 'User-Agent:',PRIMARY KEY (`id`),INDEX `id` (`id`))参考:。