php attr属性,set属性Attr

字段修改器: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性别为例:当前表中数据如下:

f459611f0a5608f8b44dcafd976b9518.png在模型中定义修改器方法:模型: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表查看表中数据:

1fefed8966f57fde72ab1e0c30d8ead9.png

下面再演示一下批量修改表中字段值的实例控制器: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)

}修改后的表中记录如下:

b8c93bac8b440921fe8b142843493e67.png注意:data($data,true),第二个参数true必须要有,否则修改器不生效。

5. 总结修改器提供了一种更加灵活的数据表写入机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值