对于前面的时间戳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