多应用+插件架构,代码干净,支持一键云编译,码云点赞13K star,4.8-4.12 预售价格198元 广告
本实例演示tp5模型非常高效的功能 原来数据表结构如下 ![](https://box.kancloud.cn/2016-08-25_57be99bc07783.png) 存储数据如下 ![](https://box.kancloud.cn/2016-08-25_57be99bc2108f.png) 如上图,ip字段,ctime,utime采用了转换成int进行存储,方便排序,查找。但直接看表中数据,并不直观,类以这类表,利用model模型,能够方便的解决数据自动转换问题 sys_log表定义model如下 ~~~ <?php namespace app\common\model; use think\Model; use think\Validate; // http://www.kancloud.cn/zmwtp/tp5/145712 model配置 class Log extends Model { protected $table = 'sys_log'; protected $auto = [ 'ip','utime']; //自动 完成字段 每次写入都执行 protected $insert = ['ctime','status'=>0,'type'=>'sys']; //插入数据 protected $update = []; //更新数据时 // 定义时间戳字段名 protected $autoWriteTimestamp = true; //支持默认两个字段,详见说明 protected $createTime = 'ctime'; protected $updateTime = 'utime'; // protected $autoTimeField = ['ctime']; protected $dateFormat = 'Y-m-d H:i:s'; //写入日期格式 //定义字段输出格式 protected $type = [ 'ctime' => 'timestamp:Y-m-d H:i:s', 'utime' => 'timestamp:Y-m-d H:i:s', ]; //验证 protected $rules = [ ['level','number|between:1,9','告警级别有误|级别必须是1~9级'], ['status','number|between:0,1','状态|状态必须是0~1'], ['message','require','信息必须'], ['ip','ip','IP地址有误'] ]; //自定义初始化 protected static function init() { //TODO:自定义的初始化 } //获取时自动处理字段转换 public function getLevelAttr($value){ $Level = [ 0=>'log', 1=>'error', 2=>'notice', 3=>'info', 4=>'debug' ]; return $Level[$value]; } //获取时自动处理字段转换 public function getIpAttr($value){ return long2ip($value); } //写入时自动处理 public function setIpAttr($value){ return ip2long(request()->ip()); } //验证访问是否有效 public function write($data){ $validate = new Validate($this->rules); if ($validate->check($data)){ return $this->data($data)->allowField(['message','level','status'])->save(); }else{ return $validate->getError(); } } public function scopeGetLast($query){ $query->order('ctime','desc'); } } ~~~ 写入数据 ~~~ $Log = model('Log','model'); // return $Log->where('id<781')->delete(); $data = [ 'message' =>'sdf', 'status'=>1, //'ip'=>'192.168.0.26', //系统自动添加 'level'=>4, //'ctime'=>"2016-08-04 15:00", ]; return $Log->write($data); ~~~ 如上,写入时,model已经定义好,会对ip,ctime,utime字段进行转换,注意,ctime,utime,model中已定义为自动添加 读取数据 ~~~ $Log = model('Log','model'); return dump(modelo2array($Log->select())); ~~~ 获取结果如下图 红色字段,已自动进行转换 ![](https://box.kancloud.cn/2016-08-25_57be99bc3cdf0.png) 附件上modelo2array()函数如下 ~~~ /* * 将model查询对像转换为数组数据 * */ function modelo2array($object){ $data = []; foreach($object as $key=>$rowO){ $data[$key] = $rowO->toArray(); } return $data; } ~~~