php model get set,模型方法:set属性Attr

字段获取器:get字段名Attr( )准确的讲:字段值个性化设置器

1. 功能:自定义字段值输出内容。通常表中sex性别都是1或0表示男,女,那么输出时可以直接显示男/女,比显示1/0要直观的多,也省去了再见一张性别表了。当然复杂字段值,还是应该单独建表。

2. 源码:/thinkphp/library/think/Model.php获取器方法定义在getAttr( )方法中。/**

* 获取器 获取数据对象的值

* @access public

* @param string $name 名称

* @return mixed

* @throws InvalidArgumentException

*/public function getAttr($name){try {$notFound = false;$value    = $this->getData($name);

} catch (InvalidArgumentException $e) {$notFound = true;$value    = null;

}// 检测属性获取器:以下就是属性获取器的代码//先解析当前的方法名//假设表中有个字段:sex,我们要针对该字段做获取器//则对应的模型方法名:getSexAttr()$method = 'get' . Loader::parseName($name, 1) . 'Attr';if (method_exists($this, $method)) {$value = $this->$method($value, $this->data);

} elseif (isset($this->type[$name])) {// 类型转换$value = $this->readTransform($value, $this->type[$name]);

} elseif ($notFound) {$method = Loader::parseName($name, 1);if (method_exists($this, $method) && !method_exists('\think\Model', $method)) {// 不存在该字段 获取关联数据$value = $this->relation()->getRelation($method);// 保存关联对象值$this->data[$name] = $value;

} else {throw new InvalidArgumentException('property not exists:' . $this->class . '->' . $name);

}

}return $value;

}注意与前面学习过的getAttr方法的区别,获取器是通过不同的方法名,执行代码中不同的逻辑的。

3. 步骤:在自定义模型类中创建获取器方法:get字段名Attr( );

在控制器中查询该字段时,将会自动调用模型中的获取器方法啦。

4. 实例:

99655940e05669566cb7b673bc78d635.pngdept是部门字段,1:开发部;2:市场部;3:客服部

下面我们就在模型中定义这个获取器方法在模型中定义获取器方法:模型:Staff.php<?phpnamespace  app\index\model;//导入模型类use think\model;class Staff extends model {/**

* dept字段的获取器

* @access public

* @param integer/string  $value 值

* @return mixed

*/    public function getDeptAttr($value){//以dept字段值为键名,设置对应的返回值$dept = [1=>'开发部',2=>'市场部',3=>'客服部'];//返回对应的数组元素return $dept[$value];

}

}控制器:Index.php<?phpnamespace  app\index\controller;//导入自定义模型类use app\index\model\Staff;class Index {  public function index(){   //获取表中id=1004的记录

$staff = Staff::get(1004);   //获取数据对象原始信息

$before = $staff -> getData('dept');   echo '1. 没用获取器方法之前 dept :'.$before;   echo '
';   //获取经获取器转换之后的信息

$after = $staff ->getAttr('dept');   echo '2. 调用获取器方法之后 dept: '.$after;

}

}源码说明:$staff ->getAttr('dept');:可用 $staff -> dept ; 代替,效果是一样的。 $staff ->dept;,其实是通过模型魔术方法__get()完成查询,我们知道,这个魔术方法其实内部是用:getAttr()来获取字段值的。

在使用获取器之前,必须先在自定义模型类Staff.php中,创建获取器方法:getDeptAttr( )方法。运行结果:1. 没用获取器方法之前 dept :22. 调用获取器方法之后 dept: 市场部

5. 总结获取器对于临时改变显示结果,是很有用的,类似于无损修改表中字段值。

6. 声明:与获取器方法对应的获取原始数据:getData()方法,这在之前的查询数据对象中已讲过,请翻看前面教程,此处不再重复!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值