字段修改器:set字段名Attr( )对于写入表中的字段值,进行个性化定制
1. 功能:自定义写入表中的字段值。自定义写入值时,一定要留意,表中该字段是否允许新字段值类型。比如原来是数据型,如果你修改成了字符型,那么请先将表中字段类型修改成正确的类型。
2. 源码:/thinkphp/library/think/Model.php修改器方法定义在setAttr( )方法中。/**
* 修改器 设置数据对象值
* @access public
* @param string $name 属性名
* @param mixed $value 属性值
* @param array $data 数据
* @return $this
*/public function setAttr($name, $value, $data = []){if (is_null($value) && $this->autoWriteTimestamp && in_array($name, [$this->createTime, $this->updateTime])) {// 自动写入的时间戳字段$value = $this->autoWriteTimestamp($name);
} else {// 检测修改器$method = 'set' . Loader::parseName($name, 1) . 'Attr';if (method_exists($this, $method)) {$value = $this->$method($value, array_merge($data, $this->data));
} elseif (isset($this->type[$name])) {// 类型转换$value = $this->writeTransform($value, $this->type[$name]);
}
}// 标记字段更改if (!isset($this->data[$name]) || ($this->data[$name] != $value && !in_array($name, $this->change))) {$this->change[] = $name;
}// 设置数据对象属性$this->data[$name] = $value;return $this;
}注意与前面学习过的setAttr方法的区别,修改器的方法名是动态变化的,根据属性名动态设置方法名,再通过不同的方法名,执行代码中不同的逻辑的。
3. 步骤:在自定义模型类中创建获取器方法:get字段名Attr( );
在控制器中查询该字段时,将会自动调用模型中的获取器方法啦。
4. 实例:我们以表中的sex性别为例:当前表中数据如下:
在模型中定义修改器方法:模型:Staff.php<?phpnamespace app\index\model;//导入模型类use think\model;use traits\model\SoftDelete;class Staff extends model {/**
* sex字段修改器
* @access public
* @param integer/string $value 值
* @return mixed
*/ public function setSexAttr($value){ switch ($value) {case '1': //如果赋值为1return '男'; //写入:男break;case '0': //如果赋值为0return '女'; //写入:女break;
}
}
}控制器:Index.php<?phpnamespace app\index\controller;//导入自定义模型类use app\index\model\Staff;class Index { public function index(){//获取id=1001的数据
$staff = Staff::get(1001); //修改当前记录的sex字段值:1
//此时会触发模型类中的修改器:setSexAttr()
$staff -> setAttr('sex',1); //写入表中
$staff ->save(); //查看当前数据对象
dump($staff->getData());
}
}现在我们再查看一下当前数据对象:array(8) {
["id"] => int(1001)
["name"] => string(6) "郭靖"
["sex"] => string(3) "男"
["age"] => int(22)
["salary"] => float(5500)
["dept"] => int(3)
["hiredate"] => string(10) "2012-12-12"
["delete_time"] => string(19) "2016-11-28 15:19:43"}可以看出:当前数据对象的sex是修改成功的。
下面再到数据库中,查看一下tp5_staff表查看表中数据:
下面再演示一下批量修改表中字段值的实例控制器:Index.php<?phpnamespace app\index\controller;//导入自定义模型类use app\index\model\Staff;class Index { public function index(){ //获取id=1001的数据
$staff = Staff::get(1001); //设置数据
$data['sex'] = 0; $data['dept'] =3; //批量修改时,自动触发修改器
$staff -> data($data,true) -> save(); //查看当前数据对象原始数据
dump($staff->getData());
}
}查看返回结果:array(2) {
["sex"] => string(3) "女"
["dept"] => int(3)
}修改后的表中记录如下:
注意:data($data,true),第二个参数true必须要有,否则修改器不生效。
5. 总结修改器提供了一种更加灵活的数据表写入机制。