本实例演示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;
}
~~~