Thinkphp中的模型可以对数据库字段进行验证规则的设置和设置一些字段的默认值(比如字段为当前时间)以及在操作数据时的的一些回调方法等
基本上每一个模型都需要设置一些验证规则和字段默认值的设置,而大部分都存在着重复的工作
特别是像需要将数据库操作记录到日志系统的,这就导致我们需要在每个模型中反复处理
针对此问题我定义一个父类模型,所以模型都继承自此类即可解决以上两个问题
父类就完成了以下两件工作:
  1. 记录增、删、改等操作到日志系统
  2. 定义一些大部分数据库都需要验证的规则(子类可覆盖或自定义)或者需要自动生成的字段(如每个数据库都有一个记录当前时间的字段create_time)
<?php
/* * * 公共模型*/
namespace Common\Model;
use Think\Model;
class CommonModel extends Model {/*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @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@163.com* @DateTime:    2016-04-08 12:08:38* @Description: 所有继承的子类字段create_time自动生成当前时间*/protected $_auto = array (array ('create_time', 'mGetDate', 1, 'callback' ),    // 增加的时候调用回调函数);/*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @DateTime:    2016-04-08 15:52:40* @Description: 返回该类的自动验证信息,用于在子类中合并该验证信息(不能在子类中定义此$_validate属性否则会被覆盖,如果不需要在子类中合并则可以可忽略此方法)*/protected function get_validate(){return $this->_validate;}/*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @DateTime:    2016-04-08 12:06:03* @Description: 获取当前时间*/protected function mGetDate() {return date ( 'Y-m-d H:i:s' );}/*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @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@163.com* @DateTime:    2016-04-08 10:50:27* @Description: 插入成功后的回调方法*/protected function _after_insert($data,$options) {$this->after_write("insert",$data,$options);}/*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @DateTime:    2016-04-08 11:56:12* @Description: 删除成功后的回调方法*/protected function _after_delete($data,$options) {$this->after_write("delete",$data,$options);}/*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @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@163.com* @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@163.com* @DateTime:    2016-04-08 12:03:57* @Description: 基础价格Model*/
namespace Common\Model;
use Common\Model\CommonModel;
class PriceModel extends CommonModel
{   /*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @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`)
)

  

参考:
TP3.2开发手册 自动验证

TP3.1开发手册 模型扩展

From WizNote

ThinikPhp 将数据库模型的增、删、改操作写入日志相关推荐

  1. 表单的增 删 改 查

    django单表操作 增 删 改 查 一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取 ...

  2. datatable更新到mysql_.NET_使用DataTable更新数据库(增,删,改),1、修改数据复制代码 代码如 - phpStudy...

    使用DataTable更新数据库(增,删,改) 1.修改数据 DataRow dr = hRDataSet.Tables["emp"].Rows.Find(textBox3.Tex ...

  3. java stringbuilder 替换字符串_StringBuilder修改字符串内容,增,删,改,插

    package seday01; /** * 字符串不变对象特性只针对字符串重用,并没有考虑修改操作的性能.因此String不适合频繁修改内容. * 若有频繁修改操作,使用StringBuilder来 ...

  4. properties(map)增.删.改.查.遍历

    import java.util.Map; import java.util.Properties; import java.util.Set;/*** properties(map)增.删.改.查. ...

  5. python学生姓名添加删除_python-函数-实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统。...

    实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统. 要求1:使用一个list用于保存学生的姓名. 要求2:输入0显示所有学员信息,1代表增加,2代表删除,3代表修改,4代表查询,exit ...

  6. PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理

    笔者最近需要使用pyspark进行数据整理,于是乎给自己整理一份使用指南.pyspark.dataframe跟pandas的差别还是挺大的. 文章目录 1.-------- 查 -------- -- ...

  7. 简单的php数据库操作类代码(增,删,改,查)

    数据库操纵基本流程为: 1.连接数据库服务器 2.选择数据库 3.执行SQL语句 4.处理结果集 5.打印操作信息 其中用到的相关函数有 •resource mysql_connect ( [stri ...

  8. Python 操作 Elasticsearch 实现 增 删 改 查

    Github 地址:https://github.com/elastic/elasticsearch-py/blob/master/docs/index.rst 官网地址:https://elasti ...

  9. 【django】数据库操作-增 删 改

    一.增加数据 增加数据有两种⽅法. 1)save 通过创建模型类对象,执⾏对象的save()⽅法保存到数据库中. f1=FilmInfo(fname='我爱你中国',pub_data='2021-10 ...

最新文章

  1. 带你看看获得鲁班奖的数据中心工程建设的有多完美!!
  2. createTemporaryView is deprecated
  3. 通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design
  4. 根据children动态复杂表头excel导出_Java高级特性-注解:注解实现Excel导出功能
  5. lvgl的区别 qt_LVGL分析-画面刷新
  6. 【吴恩达课后编程作业pytorch实现】Keras入门与残差网络的搭建【1】
  7. 冰城环保进入智慧时代
  8. springboot整合quartz定时任务
  9. DNS服务器的安装与配置
  10. 欧拉计划第80题:平方根数字展开
  11. zip压缩包太大无法用unzip成功解压(保姆级)
  12. 体验论文新神器!AMiner人工智能工具,自动溯源论文来龙去脉
  13. 华为交换机基础学习命令(ensp)
  14. C/C++电话号码查询系统
  15. C++习题:6-1 CCircle And CCylinder
  16. C语言编程输出象棋棋盘
  17. 淘宝神话-one piece 般的十年
  18. python爬虫使用正则爬取网站
  19. C# dotnet 一个看上去还能用的二进制序列化帮助类
  20. c语言调用子程序的例子,几个C语言编程应用实例.DOC

热门文章

  1. Origin如何绘制泡泡图?
  2. java小程序源码_【小程序源码分享】基于Java开发的物业管理系统!
  3. linux sql failed,Cacti SQL Failed! Error:’1062′故障排除
  4. VS 中配置使用Visual SVN系列 一:SVN Server下载和安装
  5. _cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别
  6. 深入解析Windows窗口创建和消息分发
  7. 用python定位手机_使用Python定位android和iphone
  8. Python 排序 -- sort()、sorted()
  9. 数据结构与算法(C++)– 二叉查找树(Binary Search Tree )
  10. 呵护宝宝健康成长 飞鹤携手第四范式天枢打造精准智能推荐