关于ThinkPHP中的AR模式的介绍和应用

AR模式的介绍:

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


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

AR类     ===     模型关联了的数据表

AR类的属性     ===     表中的字段

AR类实例     ===     表中的记录

AR模式的语法格式:

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

//实例化模型

$model = M(关联的表);

//字段映射到属性

$model -> 属性/表中字段 = 字段值;

$model -> 属性/表中字段 = 字段值;


//AR实例(操作)映射到表中记录

$model -> CURD操作; //CURD操作没有参数


AR模式的CURD操作:

1、增加操作:

案例:使用AR模式在dept表中添加数据:


    //AR模式的增加操作
    public function test(){
        //第一个映射:类映射表(类关联表)
        $model = M('Dept');
        //第二个映射:属性映射字段
        $model -> name = '技术部';
        $model -> pid = '0';
        $model -> sort = '10';
        $model -> remark = '技术部很重要';
        //第三个映射:实例映射记录
        $result = $model -> add();//没有参数
        dump($result);
    }

执行结果:

数据库中的结果:

通过数据表中的记录可以得知,其返回值表示新增记录的主键id

跟踪信息中的sql语句:

问题1:难道父类模型中真的有name、pid、sort、remark属性么?

答:通过观察父类模型的底层实现,我们找到了一个特殊的魔术方法__set,可以参考php手册:

我们可以在model父类中找到__set魔术方法:

为什么add方法中没有传递参数也能够输出?原因是add方法底层实现中有个if方法去判断是否传参,如果没有传递参数将使用父类模型中的data获取当前数据对象的值。

2、修改操作:

案例:使用AR模式给dept表中修改数据,将id=12的一条记录中的“技术部”修改为“法务部”。
//AR模式的修改操作
    public function test(){
        //第一个映射:类映射表(类关联表)
        $model = M('Dept');
        //第二个映射:属性映射字段
        $model -> id = '12';
        $model -> name = '法务部';
        $model -> remark = '法务部也很重要';
        //修改操作
        $result = $model -> save();
        //打印
        dump($result);
    }
    

需要注意:不管是直接通过save方法传递数组,还是使用AR模式,修改时候的主键id必须需要

执行结果:

int(1)表示受到影响的行数。

跟踪信息中的sql语句:

数据库中的结果:

save方法和add方法一样不需要传递参数,因为其底层实现的方法中同样都有if条件判断。


3、查询操作:

在ThinkPHP中,AR模式下没有查询操作,这里的查询操作可以使用CURD的select和find方法。

4、删除操作:

案例:使用AR模式给dept表中的数据删除。

注意:在使用修改和删除操作时,为了防止误操作,系统要求必须指定主键信息。

//AR模式的删除操作
    public function test(){
        //第一个映射:类映射表(类关联表)
        $model = M('Dept');
        //第二个映射:属性映射字段
        $model -> id = '12';//属性可以指定1个主键也可以指定多个主键
        //删除操作
        $result = $model -> delete();
        //打印
        dump($result);
    }

打印结果:

跟踪信息中的sql语句:

数据库中的结果:

补充说明:

在AR模式中U、D操作必须需要指定主键信息,但是有一种情况下可以不指定主键也能执行U、D操作:在之前有做过查询语句,则后面如果没有指定主键,会操作当前查询到的记录

修改操作的案例:

    public function test(){
        //实例化模型
        $model = M('Dept');
        //查询操作
        $model -> find(14);
        //修改操作
        $model -> name = '美工部';
        $result = $model -> save();
        //打印
        dump($result);
    }

执行结果:

跟踪信息中的sql语句:

删除操作的案例:

    public function test(){
        //实例化模型
        $model = M('Dept');
        //查询操作
        $model -> find(14);
        //删除操作
        $result = $model -> delete();
        //打印
        dump($result);
    }

执行结果:

跟踪信息中的sql语句:


猜你喜欢

转载自blog.csdn.net/qq_41630218/article/details/80956305