类型转换
对于前面的时间戳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 | 序列化 |
自动完成
系统已经自动写入了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 | 仅更新的时候自动完成的属性数组 |
1、类型转换
在users模式中添一个
//类型转换 就可以代替读取器和写入器
protected $type = array(
'birthday' =>'timestamp:Y-m-d', //输出birthday 就应该为:2018-11-07
'nickname' =>'serialize', //昵称序列化
);
在控制器中
//类型转换
$user = Users::get(1);
echo $user->birthday.'<br>';
结果为:
2018-09-10
$data['email'] = '2153434@qq.com';
$data['nickname'] = 'yefeng'; //这个nickname也会被序列化 也可以定议成一个数组 [aa=>'11']
$data['birthday'] = '2018-06-12'; //会被自动转换成时间戳
$user = new Users();
$result = $user->save($data);
//INSERT INTO `tp_users` (`email` , `nickname` , `birthday`) VALUES ('2153434@qq.com' , 's:6:\"yefeng\";' , 1528732800)
$user = Users::get(43);
echo $user->birthday.'<br>';
echo $user->nickname;
数据库中的记录为:43 2153434@qq.com s:6:"yefeng"; 1528732800
结果为:
2018-06-12
yefeng
2、自动完成
在USERS模式中配置
//自动完成 更新的时候 配合修改器使用 , 假如商城默认只卖女士用品,创建用户的时候时候默认sex为0
protected $insert = array(
'sex' => 0,
);
在index控制器中
//自动完成,就是比如在向数据库中插入数据的时候 你想要某个字段自动完成插入。
Users::create(['email' => '124455@qq.com']); //这样他就会自动把sex 为0 插入进去。
// INSERT INTO `tp_users` (`email` , `sex`) VALUES ('124455@qq.com' , 0)
自动完成 有三种insert(插入时) update(更新时) auto (是插入和更新时都启用)
3、自动完成与修改器配合使用
//类型转换 就可以代替读取器 写入器
protected $type = array(
'birthday' =>'timestamp:Y-m-d', //输出birthday 就应该为:2018-11-07
'nickname' =>'serialize', //昵称序列化
);
//根据头像来判断 如果是boy 就是1否刚就是0 这个时候只需要告诉系统那些字段需要自动更新 再配合修改器一起使用setSexAttr
protected $update = array( //更新时执行
'sex',
);
protected function setSexAttr($value,$data){ //根据头像来判断 如果是
return $data['head_pic'] == 'boy.jp'?1:0;
}
//自动完成与修改器配合使用
$user = Users::get(1);
$user->sex = 0;
$user->birthday = '2018-12-01';
$user->save();
//UPDATE `tp_users` SET `sex`=0 WHERE `user_id` = 1