• ThinkPHP---AR模式


    【前言】

    在之前学习框架时介绍过

    (1)什么是框架?

    ①框架是一堆包含了常量、方法和类等代码集合;

    ②半成品应用,只包含了项目开发时的底层架构,并不包含业务逻辑;

    ③包含一些设计模式,例如单例模式,工厂模式,AR(Active Record积极记录)模式

    【主体】

     (1)简介:AR模式即Active Record模式,是一个对象关系映射(ORM) 技术。每个AR 类代表一张数据表(或视图),  数据表(或视图)的字段在AR 类中体现为类的属性,一个AR实例

    则表示表中的。

     AR模式核心:三个映射 / 对应

                           AR类   ==   表;(模型类关联了数据表)

                     AR类属性  ==   表的字段;

                    AR类实例   ==   表的记录;

    AR模式语法格式:

    AR模式在ThinkPHP中的典型应用:CURD操作

    //实例化模型
    $model = M(关联的表);//AR类关联到表,AR类映射到表
    //字段映射到属性
    $model -> 属性/表中字段 = 字段值;
    $model -> 属性/表中字段 = 字段值;
    ...
    //AR实例(操作)映射到表中记录
    $model ->CURD操作,没有参数

     总结:3个映射关系→类映射到表;属性映射到字段;实例映射到记录

    【二】应用(AR模式中的CURD操作)

    (1)C

    案例:使用AR模式的语法格式实现增加操作,注意:AR模式的CURD操作没有参数

    public function test(){
                //类映射表(类关联表),模型实例化
                $model = M('dept');
                //属性映射字段(属性关联字段),属性名与字段名一致
                $model -> name='技术部';
                $model -> pid='0';
                $model -> sort='1';
                $model -> remark='AR模式新增记录';
                //实例映射记录
                $result = $model ->add();//返回新增记录的主键id
            }

    返回值和之前add()返回值一样,都是新增记录的主键id

    跟踪信息里的SQL语句与原生php相同:INSERT INTO `sp_dept` (`name`,`pid`,`sort`,`remark`) VALUES ('技术部','0','1','AR模式新增记录') [ RunTime:0.1200s ]

    疑问:通过上述代码,可能会有两个疑惑:①父类模型上有name、pid、sort、remark等属性吗?②为什么add方法没有参数也能执行添加操作?

    问题①:

             想知道答案的话需要从底层代码着手去分析,这里打开父类系统模型文件Think/Model.class.php可以找到里面有魔术方法__set,__get,__isset等,下面列举下

    /**
         * 设置数据对象的值
         * @access public
         * @param string $name 名称
         * @param mixed $value 值
         * @return void
         */
        public function __set($name,$value) {
            // 设置数据对象属性
            $this->data[$name]  =   $value;
        }

    查阅手册后即可知道,魔术方法__set()在给不可访问属性赋值时会被自动调用

    输出$model如下,可以发现底层魔术方法已经将属性映射字段

    ["data":protected] => array(4) {
        ["name"] => string(9) "技术部"
        ["pid"] => string(1) "0"
        ["sort"] => string(1) "1"
        ["remark"] => string(20) "AR模式新增记录"
      }
    ]

     问题②:

             和上面一样,查看底层代码,父类模型下

    /**
         * 新增数据
         */
        public function add($data='',$options=array(),$replace=false) {
            if(empty($data)) {
                // 没有传递数据,获取当前数据对象的值,所以即使add()没有传递参数仍然会执行
                if(!empty($this->data)) {
                    $data           =   $this->data;
                    // 重置数据,增加重用性
                    $this->data     = array();
                }else{
                    $this->error    = L('_DATA_TYPE_INVALID_');
                    return false;
                }
            }
    }

    (2)U

    案例:使用AR模式实现对部门数据表的记录修改

    注意:不管是使用save()方法传递一维数组进行修改,还是通过AR模式修改,都需要主键id(因为不允许批量修改)

    public function test(){
                //类映射表(类关联表),模型实例化
                $model = M('dept');
                //属性映射字段(属性关联字段),属性名与字段名一致
                $model -> id='23';//确定主键id
                $model -> name='AR修改技术部.';
                $model -> remark='AR模式修改记录';
                // dump($model);
                //实例映射记录,修改操作
                $result = $model ->save();//返回值为影响行数
                dump($result);
            }

    跟踪信息输出:UPDATE `sp_dept` SET `name`='AR修改技术部.',`remark`='AR模式修改记录' WHERE `id` = 23 [ RunTime:0.0010s ]

    同样,save()方法可以和add()方法一样,不传递参数。因为底层代码都有过相关操作。

    (3)R

    在ThinkPHP里,AR模式没有查询操作。所以这里的查询操作还是使用之前的select和find方法

    (4)D

    删除的时候必须指定主键信息

    案例:使用AR模式删除表中数据

    public function test(){
                //类映射表(类关联表),模型实例化
                $model = M('dept');
                //指定主键信息
                $model -> id='23,17';//指定删除的主键id
                //删除操作
                $result = $model -> delete();
                dump($result);
    }

    跟踪信息的sql语句:DELETE FROM `sp_dept` WHERE `id` IN ('23','17') [ RunTime:0.0010s ]

    拓展:

            在AR模式里U、D操作必须指定主键信息,但有一种情况除外。如果之前执行过查询查询语句,则后面可以不指定主键,仍然可以查询到相应记录。但只能修改单条

    //AR模式可以不指定主键信息
            public function test(){
                //实例化模型
                $model = M('dept');
                //查询
                $data = $model -> find(22);
                //修改
                $model -> pid='2';
                $model -> save();
            }

              跟踪信息SQL语句:UPDATE `sp_dept` SET `name`='技术部',`pid`='2',`sort`='1',`remark`='AR模式新增记录' WHERE `id` = 22 [ RunTime:0.0020s ]

           

    .

  • 相关阅读:
    python学习笔记之小小购物车
    TestNg学习一
    网监利器镜像——原理配置篇
    改变人生的31个黄金思维
    培养人脉的106个技巧
    CIR,CBS,EBS,PIR,PBS傻傻分不清楚?看这里!—-揭秘令牌桶
    请别浪费你30岁前的时光,职场“35岁现象”
    VRRP主备备份配置示例—实现网关冗余备份
    关于JS的prototype
    使用 Bootstrap Typeahead 组件
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/8672228.html
Copyright © 2020-2023  润新知