模型数据处理

模型提供比数据库类更为强大的数据处理功能,处理数据可以更方便,更安全

获取器

获取器的作用是对模型的数据对象的(原始)数据做出自动处理。

定义:受保护的方法,名字格式为: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'));

场景栗子:

  1. 时间日期字段的格式化输出;
$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')

  1. 集合或枚举类型的输出;
//Config
'if_show'=>[
    '0'=>'下架',
    '1'=>'上架',
    '3'=>'待审核'
]
//Model
$protected function getFieldNameAttr($value){
    $if_show=\think\Config::get('if_show');
    return $if_show[$value];
}
  1. 虚拟字段的输出;

使用虚拟一个字段来避免获取器重名,使一个字段达到不同效果

//Model-1
$protected function getTextAttr($value,$data){
    return $data['id'];
}
//HTML
<{$vo->text}>
  1. 组合字段的输出;
//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'];// 仅针对修改的情况

待补充

最后编辑:2020年02月19日 ©著作权归作者所有

发表评论

正在加载 Emoji