对于前面的时间戳birthday的例子,还可以进行进一步的简化,这里需要用到类型强制转换的功能,在User模型类中添加定义:
<?php
namespace app\index\model;
use think\Model;class User extends Model{ protected $dateFormat = 'Y/m/d'; protected $type = [ // 设置birthday为时间戳类型(整型)
'birthday' => 'timestamp',
];
}不需要定义任何修改器和读取器,我们完成了相同的功能。
对于timestamp和datetime类型,如果不设置模型的dateFormat属性,默认的日期显示格式为:Y-m-d H:i:s,或者也可以显示的设置日期格式,例如:
<?php
namespace app\index\model;
use think\Model;class User extends Model{ protected $type = [ // 设置birthday为时间戳类型(整型)
'birthday' => 'timestamp:Y/m/d',
];
}对于简单的数据格式转换之类的处理,设置类型转换比定义修改器和读取器更加方便。
ThinkPHP5.0支持的转换类型包括:
| 类型 | 描述 |
|---|---|
| integer | 整型 |
| float | 浮点型 |
| boolean | 布尔型 |
| array | 数组 |
| json | JSON类型 |
| object | 对象 |
| datetime | 日期时间 |
| timestamp | 时间戳(整型) |
| serialize | 序列化 |
对于固定的时间戳和时间日期型的字段,比如文章的创建时间、修改时间等字段,还有比设置类型转换更简单的方法,尤其是所有的数据表统一处理的话,只需要在数据库配置文件中添加设置:
// 开启自动写入时间戳字段'auto_timestamp' => true,
再次访问
http://tp5.com/user/add
会发现系统已经自动写入了think_user数据表中的的create_time、update_time字段,如果自动写入的时间戳字段不是这两个的话,需要修改模型类的属性定义,例如:
<?php
namespace app\index\model;
use think\Model;class User extends Model{ // 定义类型转换
protected $type = [ 'birthday' => 'timestamp:Y/m/d',
]; // 定义时间戳字段名
protected $createTime = 'create_at'; protected $updateTime = 'update_at';
}如果个别数据表不需要自动写入时间戳字段的话,也可以在模型里面直接关闭:
<?php
namespace app\index\model;
use think\Model;class User extends Model{ // 定义类型转换
protected $type = [ 'birthday' => 'timestamp:Y/m/d',
]; // 关闭自动写入时间戳
protected $autoWriteTimestamp = false;
}关闭自动写入时间戳后,我们再次访问URL地址:
http://tp5.com/user/add
重新生成的数据已经没有自动写入时间戳了,而是数据库默认值写入。
系统已经自动写入了think_user数据表中的的create_time、update_time字段,如果我们希望自动写入其它的字段,则可以使用自动完成功能,例如下面实现新增的时候自动写入status字段。
<?php
namespace app\index\model;
use think\Model;class User extends Model{ // 定义类型转换
protected $type = [ 'birthday' => 'timestamp:Y/m/d',
]; // 定义自动完成的属性
protected $insert = ['status' => 1];
}除了insert属性之外,自动完成共有三个属性定义,分别是:
| 属性 | 描述 |
|---|---|
| auto | 新增及更新的时候自动完成的属性数组 |
| insert | 仅新增的时候自动完成的属性数组 |
| update | 仅更新的时候自动完成的属性数组 |
自动完成属性里面一般来说仅仅需要定义属性的名称,然后配合修改器或者类型转换来一起完成,如果写入的是一个固定的值,就无需使用修改器。status属性的自动写入可以直接使用:
'status' => 1
完成后,我们访问URL地址:
http://tp5.com/user/add
最后的输出结果为:
用户[ 流年:12 ]新增成功
为了便于看到效果,我们修改控制器的read操作方法输出更多的属性:
// 读取用户数据public function read($id=''){ $user = UserModel::get($id); echo $user->nickname . '<br/>'; echo $user->email . '<br/>'; echo $user->birthday . '<br/>'; echo $user->status . '<br/>'; echo $user->create_time . '<br/>'; echo $user->update_time . '<br/>';
}然后,访问URL地址:
http://tp5.com/user/12
最后的输出结果为:
流年 thinkphp@qq.com1977/03/0512016-05-02 16:21:332016-05-02 16:21:33
可以看到status、create_time和update_time都实现了自动写入。
如果你的status属性的值不是固定的,而是需要条件判断,那么我们可以定义修改器来配合自动完成。
<?phpnamespace app\index\model;use think\Model;class User extends Model{ // 定义类型转换
protected $type = [ 'birthday' => 'timestamp:Y/m/d',
]; // 定义自动完成的属性
protected $insert = ['status']; // status属性修改器
protected function setStatusAttr($value, $data)
{ return '流年' == $data['nickname'] ? 1 : 2;
} // status属性读取器
protected function getStatusAttr($value)
{ $status = [-1 => '删除', 0 => '禁用', 1 => '正常', 2 => '待审核']; return $status[$value];
}
}我们访问下面的URL地址进行批量新增
http://tp5.com/user/add_list
之后,访问
http://tp5.com/user/18
最后的输出结果为:
张三 zhanghsan@qq.com1988/01/15待审核2016-05-02 16:40:572016-05-02 16:40:57