ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
获取器: 获取器 获取数据对象的值;如果存在`'get'.$name.'Attr'`方法则调用它,否则查看type属性里是否以键的形式存在,存在即转换类型,否则查看是是createTime和updateTime属性的值,是则转换时间格式,那么就查找当前Model类对象的data属性里是否有此键,是则返回,否则将$name当做关联方法执行(该属性为驼峰或小写+下划线格式都可以,最后都会转化为驼峰格式执行),关联方法也不存在的话 即上面都不存在则抛出错误 ``` namespace app\index\model; use think\Model; use think\Db; class Banner extends Model{ $type=['items'=>'integer']; $createTime="items"; public function items(){ return $this->hasMany('BannerItem','banner_id','id'); } public function getItemsAttr($value,$data){ //... } } ``` ### **例子:拼装url** 如image表的url字段有个数据为/woman.jpg  并且我们将图片存到public/images目录下的 application/setting.php 定义 ~~~ return [ 'img_prefix'=>'http://www.tp5.lichihua.com/images' ]; ~~~ 获取可以 ~~~ $img_prefix=config('setting.img_prefix'); ~~~ 组装:我么可以在model/Image.php中定义一个读取器的方法格式为 get+当前模型的某个字段名+Attr ~~~ <?php namespace app\api\model; use think\Model; class Image extends Model{ protected $hidden=['id','from','delete_time','update_time']; /** * url读取器 组装之后用model查询出来的url就是完整的路径了 * from字段为1表示本站图片 2为网络资源即带有http:完整url路径 * @param max $value 自动获取的image表中url字段的值 * @param max $data image的所有字段数据 * @return string 返回组装好图片的url地址 */ public function getUrlAttr($value,$data){ $finalUrl=$value; if ($data['from']==1) { $finalUrl = config('setting.img_prefix').$value; } return $finalUrl; } } ~~~  读取器触发的方式,模型调用字段属性的时候自动调用 如下面的代码也能调用getUrlAttr读取器方法:上面的getBannerById方法在 return $banner;时由于关联模型会关联到Image框架会自动的调用Image模型的每一个模型属性没有显示的调用! ~~~ $img=new Image(); $img->url; ~~~ 但是其他的模型字段也有类似的需求呢?我们就需要新建一个基类集成mode然后其他的model集成这个基类然后将读取器放到基类里, 但是有个弊端当继承基类的模型可能隐式的调用有夺取器的字段时,他会自动调用读取器的,这不是我们所期望的,所以我们需要改造一下! ~~~ <?php namespace app\api\model; use think\Model; class BaseModel extends Model { public function prefixImgUrl($value,$data){ $finalUrl=$value; if ($data['from']==1) { $finalUrl = config('setting.img_prefix').$value; } return $finalUrl; } } <?php namespace app\api\model; use app\api\model\BaseModel; class Image extends BaseModel{ protected $hidden=['id','from','delete_time','update_time']; public function getUrlAttr($value,$data){ return $this->prefixImgUrl($value,$data); } } ~~~ 调用解析步骤 ``` new \app\index\model\banner()->getAttr('items'); //先找getItemsAttr() 这里会将$name的值转为驼峰在组装,没找到再找$this->type['items']是否存在,没找到再找$this->createTime的值,还没找到继续查找data属性里是否有此键,有则返回值, 还没找到在找items关联方法,否则直接抛出错误 还有中在model中调用不存在的属性时也会触发,这是最常用的 所以在定义 获取器方法、定义type、createTime、updateTime属性和关联方法时格外注意 比如在定义关联方法时不要与表字段名一样,定义了get字段名Attr方法时,就不要在type属性里定义这个字段了,type定义的会被忽略 ```