老莫的笔记本  
  
查看: 1318|回复: 2

TP5 模型的读取器与修改器getAttr() 和 setattr()

[复制链接]

662

主题

878

帖子

5141

积分

超级版主

Rank: 8Rank: 8

积分
5141
发表于 2018-8-14 06:56:09 | 显示全部楼层 |阅读模式
其实吧 就是默认初始化数据库中的值;
一、模型的读取器
触发条件:当模型对象读取表中字段值的时候
应用场景:日期时间字段,集合或枚举数据,数字状态与文本转换,字段拼装;
设置位置:在模型中设置,访问属性通常为protected,不允许外部直接访问;
方法名称:【就是命名规则】 get属性名称Attr($name,$data=[])
    例如: getFieldNameAttr($name,$data=[]);     // 驼峰命名法,对应表中字段名:  field_name

模型读取器的工作原理:
1.获取表中的记录并创建模型对象    $staff=Staff::get(1088);
2.模型对象访问属性                        $staff->hiredate;
3.自动调用模型__get();                    [这是模型自己干的事]
4.__get()调用getAttr();                    [这是模型自己干的事]
5.getAttr() 解析读取器.get字段名attr()           [这是模型自己干的事]
6.输出数据                                      return $staff->hiredate;
【备注:模型记录原始数据保存在$data属性中,可用getData() 方法获取  $staff->getData('字段名称')  前面几章其实常用】
【我个人认为,所谓的模型读取器,其实就是在读取的时候提前对他进行操作,比方说权限1是admin ,权限2 是超级管理员, 而我们输出不是权限,而是他的职位名称。 因为我们操作的是模型,模型再操作数据库, 那么 在我们控制器读取模型变量的时候,模型就对这个变量预先处理加工,替换掉变量本身还叫这个名还给控制器】

controller/Dbk.php
  1. <?php
  2. namespace app\articles\controller;
  3. use app\articles\model\Staff;  //先引入 staff 类;
  4. header("Content-type: text/html; charset=utf-8");
  5. class Dbk
  6. {
  7.     public function mk1()
  8.     {
  9.         return '进来了    }
  10.     public function mk2()
  11.     {
  12.         $lma = Staff::get(17);
  13.         return '拿到了'.$lma->name.'数据. 他的辞职的时间是'.$lma->lmtime ;
  14.     }
  15.      public function mk3()
  16.     {
  17.         $lma = Staff::get(17);
  18.         return $lma->lmtime ;
  19.     }
  20. }
复制代码

model/Staff.php
  1. <?php
  2. namespace app\articles\model;
  3. use think\Model;
  4. class Staff extends Model
  5. {
  6.     // 模型创建完成 文件名=类名=数据表名
  7.       
  8.     // 这就是模型读取器
  9.     // protected function getLmTimeAttr($lmtime)
  10.     // {
  11.     //     return strtotime($lmtime);
  12.     // }
  13.     // 读取器的第二个参数 $data 表示当前模型对象所有的值
  14.     protected function getLmTimeAttr($lmtime,$data)
  15.     {
  16.         return $data['name'].'的职位是'.$data['juese'].'他的辞职的时间是'.strtotime($lmtime);
  17.     }
  18. }
复制代码


回复

使用道具 举报

662

主题

878

帖子

5141

积分

超级版主

Rank: 8Rank: 8

积分
5141
 楼主| 发表于 2018-8-14 07:29:08 | 显示全部楼层
本帖最后由 周大胖子 于 2018-8-14 22:16 编辑

模型的修改器
触发条件:当模型对象向表中新增数据或更改字段值的时候;
应用场景:日期时间字段,集合或枚举数据,数字状态或文本装换,字段拼装;
设置位置:在模型中设置,访问属性通常为protected,不允许外部直接访问;
方法名: set属性名称Attr($name,$data=[]);
工作原理:
1.当使用模型对数据表进行操作的时候,【新增或更新】 仅限 save() 方法
2.自动调用模型__set()                              // 模型自动运行
3.__set()自动调用setAttr()                            // 模型自动运行
4.setAttr()解析读取器:set字段名Attr()                            // 模型自动运行
5.返回受影响的记录数

controller/Dbk.php
  1. // 模型修改器的测试
  2.     public function mk4()
  3.     {
  4.         $staff= new Staff;
  5.         $staff->name = '大力        $staff->gongzi = 6777;
  6.         $staff->age = 76;
  7.         $staff->juese = 2;
  8.         $staff->lmtime = '1502204401        if($staff->save()){
  9.             return $staff->name.'入职成功,他的ID是'.$staff->id;
  10.         }else{
  11.             return '入职失败        }
  12.     }
  13.     // 这是修改中文字段的测试 不过测试反了 咳咳 应该输入市场部 存入1  结果我写成了 输入1 存入市场部 尴尬
  14.     public function mk5($a)
  15.     {
  16.         $lma = Staff::get($a);
  17.         return $lma->juese;
  18.     }
复制代码


modle/Staff.php
  1. // 下面是模型修改器  这里的$data 就是当前模型对象所有的值,我感觉是相互间的处理
  2.     protected function setLmTimeAttr($lmtime,$data)
  3.     {
  4.         return date('Y-m-d h:i:s', $lmtime);
  5.     }
复制代码




回复

使用道具 举报

662

主题

878

帖子

5141

积分

超级版主

Rank: 8Rank: 8

积分
5141
 楼主| 发表于 2018-8-14 22:18:32 | 显示全部楼层
一个中文的尝试【已成功】model/staff.php
  1.     // 以下是我中文换序的一些幻想
  2.     protected function setJueSeAttr($juese)
  3.     {
  4.         if($juese=='研发部'){
  5.             return 1;
  6.         }else if($juese=='市场部')
  7.         {
  8.             return 2;
  9.         }else if($juse=='总经办'){
  10.             return 3;
  11.         }
  12.     }
  13.     protected function getJueSeAttr($juese)
  14.     {
  15.         if($juese==1){
  16.             return '研发部        }else if($juese==2)
  17.         {
  18.             return '市场部        }else if($juse==3){
  19.             return '总经办        }
  20.     }
复制代码

controller/Dbk.php  【 需要注意的是 其实上段代码和下段代码 不是一套 上段代码我修正过了】
  1. // 模型修改器的测试
  2.     public function mk4()
  3.     {
  4.         $staff= new Staff;
  5.         $staff->name = '大力        $staff->gongzi = 6777;
  6.         $staff->age = 76;
  7.         $staff->juese = 2;
  8.         $staff->lmtime = '1502204401        if($staff->save()){
  9.             return $staff->name.'入职成功,他的ID是'.$staff->id;
  10.         }else{
  11.             return '入职失败        }
  12.     }
  13.     // 这是修改中文字段的测试 不过测试反了 咳咳 应该输入市场部 存入1  结果我写成了 输入1 存入市场部 尴尬
  14.     public function mk5($a)
  15.     {
  16.         $lma = Staff::get($a);
  17.         return $lma->juese;
  18.     }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表