AR模式的介绍:
AR模式即Active Record模式,是一个对象-关系映射(ORM)技术。每个AR 类代表一张数据表(或视图),数据表(或视图)的字段在 AR 类中体现为类的属性,一个AR 实例则表示表中的一行。
AR类的属性 === 表中的字段
AR类实例 === 表中的记录
AR模式的语法格式:
AR模式在ThinkPHP中的典型的应用:CURD操作。
//实例化模型
$model = M(关联的表);
//字段映射到属性
$model -> 属性/表中字段 = 字段值;
$model -> 属性/表中字段 = 字段值;
…
//AR实例(操作)映射到表中记录
$model -> CURD操作; //CURD操作没有参数
AR模式的CURD操作:
1、增加操作:
//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模式的修改操作
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语句: