第九天:(4)类型转换和自动完成【模型和关联】

第九天:(4)类型转换和自动完成【模型和关联】

类型转换

对于前面的时间戳birthday的例子,还可以进行进一步的简化,这里需要用到类型强制转换的功能,在User模型类中添加定义:

<?php
namespace app\index\model;

use think\Model;class User extends Model{    protected $dateFormat = 'Y/m/d';    protected $type       = [        // 设置birthday为时间戳类型(整型)
        'birthday' => 'timestamp',
    ];

}

不需要定义任何修改器和读取器,我们完成了相同的功能。

对于timestampdatetime类型,如果不设置模型的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数组
jsonJSON类型
object对象
datetime日期时间
timestamp时间戳(整型)
serialize序列化

自动时间戳

对于固定的时间戳和时间日期型的字段,比如文章的创建时间、修改时间等字段,还有比设置类型转换更简单的方法,尤其是所有的数据表统一处理的话,只需要在数据库配置文件中添加设置:

// 开启自动写入时间戳字段'auto_timestamp' => true,

再次访问

http://tp5.com/user/add

会发现系统已经自动写入了think_user数据表中的的create_timeupdate_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_timeupdate_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

可以看到statuscreate_timeupdate_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



回复列表



回复操作

正在加载验证码......

请先拖动验证码到相应位置