模型数据处理
模型提供比数据库类更为强大的数据处理功能,处理数据可以更方便,更安全
获取器
获取器的作用是对模型的数据对象的(原始)数据做出自动处理。
定义:受保护的方法,名字格式为:get+FieldName(大驼峰)+Attr,一般数据库的字段都是小写+下划线格式所以需要转换为驼峰法
写法:
//Model
$protected function getFieldNameAttr($value){
return $value;
}
//View
<{$vo['id']}>//原本输出代码
<{$vo->id}>//输出处理过的数据
<{$vo->getAttr('id')}>//输出处理过的数据
<{$vo->getData('id')}>//不触发-输出原数据
自动触发:
- 模型的数据对象取值操作(
$model->field_name
); - 模型的序列化输出操作(
$model->toArray()
); - 显式调用getAttr方法(
$this->getAttr('field_name')
);
场景栗子:
- 时间日期字段的格式化输出;
$protected function getFieldNameAttr($value){
return data('Y-m-d H:i:s',$value);
}
时间戳转本地时间data('Y-m-d H:i:s',time())
本地时间转时间戳strtotime('2020-02-18')
- 集合或枚举类型的输出;
//Config
'if_show'=>[
'0'=>'下架',
'1'=>'上架',
'3'=>'待审核'
]
//Model
$protected function getFieldNameAttr($value){
$if_show=\think\Config::get('if_show');
return $if_show[$value];
}
- 虚拟字段的输出;
使用虚拟一个字段来避免获取器重名,使一个字段达到不同效果
//Model-1
$protected function getTextAttr($value,$data){
return $data['id'];
}
//HTML
<{$vo->text}>
- 组合字段的输出;
//Model
$protected function getFieldNameAttr($value,$data){
return '['.$data['id'].']——'.$value;
}
推荐使用3,虚拟字段
和4, 组合字段
一起使用效果更好
修改器
和获取器相反,修改器的主要作用是对模型设置的数据对象值进行处理
触发条件
- 模型对象赋值;
- 调用模型的
data
方法,并且第二个参数传入true
; - 调用模型的
save
方法,并且传入数据; - 显式调用模型的
setAttr
方法; - 定义了该字段的自动完成;
//对密码字段进行MD5加密后存入数据库
protected function setUpwdAttr($value){
return md5($value);
}
场景栗子
- 时间日期字段的转换写入;
- 集合或枚举类型的写入;
// 极少数情况会涉及到这种方式来处理
protected function setPermissionAttr($value){
$permission = \think\Config::get('permission');
foreach($permission as $k=>$v){
if($v === $value){
return $k;
}
}
return 0;
}
//Config
'permission'=[
'0'=>'有权限',
'1'=>'无权限'
]
- 数字状态字段的写入;
- 某个字段涉及其它字段的条件或者组合写入;
自动时间字段
待补
// 开启时间字段自动写入protected $autoWriteTimestamp = true;
// 定义时间字段名protected $createTime = 'create_at';
protected $updateTime = 'update_at';
数据类型转换
待补
数据自动完成
[自动完成]当提交的表单(数据)中不存在某个字段,我们可以通过自动完成的方式添加上这个字段,同时会触发该字段的修改器
protected $auto = ['add_time'];
// 针对添加和修改的动作的时候,对表单自动添加字段;
protected $insert = ['permission'=>2];// 仅针对新增的情况
protected $update = ['login_times'];// 仅针对修改的情况
评论