【前言】

在之前学习框架时介绍过

(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 ]

.

ThinkPHP---AR模式的更多相关文章

  1. AR模式

    AR模式 在ThinkPHP框架中,一共存在两种操作模式:ORM模式与AR模式 ORM模式:① 实例化模型 ② 创建数据对象组装数组 ③ 调用相关方法执行相关操作 AR模式:① 实例化模型 ② 把数据 ...

  2. 黑马lavarel教程---5、模型操作(AR模式)

    黑马lavarel教程---5.模型操作(AR模式) 一.总结 一句话总结: AR: ActiveRecord :Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型 ...

  3. Spring boot+Mybatisplus用AR模式实现逻辑删除操作

    Mybatisplus的AR模式 Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录.ActiveRecord ...

  4. ThinkPHP调试模式与日志记录

    1.可以在config.php中进行设置,默认为关闭状态. 'APP_DEBUG'   =>  true 打开\ThinkPHP\Common\debug.php文件可以查看debug的默认设置 ...

  5. ThinkPHP URL模式和URL重写

    现在用的版本是TP3.1.3,这两天总是遇到NotFound的错误,解析路径错误,所以认真研究了一下手册,发现问题出在URL模式上面. URL模式 一般是使用U方法来生成路径,U方法的定义规则如下(方 ...

  6. thinkphp URL 模式

    兼容ThinkPHP三种url模式的nginx rewrite location / { root /var/www; index index.html index.htm index.php; if ...

  7. centos7 nginx完整支持thinkphp pathinfo模式开启方法

    thinkphp运行在linux+nginx,如何开启pathinfo模式,我是完整测试过了,没问题的,在thinkphp配置文件 开启    'URL_MODEL'   =>  1,   1代 ...

  8. thinkphp 应用模式

    应用模式提供了对核心框架进行改造的机会,可以让你的应用适应更多的环境和不同的要求. 每个应用模式有自己的模式定义文件,用于配置当前模式需要加载的核心文件和配置文件,以及别名定义.行为扩展定义等等.根据 ...

  9. thinkphp 调试模式

    ThinkPHP有专门为开发过程而设置的调试模式,开启调试模式后,会牺牲一定的执行效率,但带来的方便和除错功能非常值得. 直线电机哪家好直线电机生产厂家 我们强烈建议ThinkPHP开发人员在开发阶段 ...

  10. thinkphp cbd模式

    ThinkPHP从3.0版本开始引入了全新的CBD(核心Core+行为Behavior+驱动Driver)架构模式,因为从底层开始,框架就采用核心+行为+驱动的架构体系,核心保留了最关键的部分,并在重 ...

随机推荐

  1. c#基于事件模型的UDP通讯框架(适用于网络包编解码)

    之前写过一篇关于c#udp分包发送的文章 这篇文章里面介绍的方法是一种实现,可是存在一个缺点就是一个对象序列化后会增大非常多.不利于在网络中的传输. 我们在网络中的传输是须要尽可能的减小传送的数据包的 ...

  2. Deferred Rendering(二)G-Buffer的组织

    先来看一张网上广为流传的<杀戮地带2>典型的Deferred Shading的G-Buffer组织: 这里补充解释下几个点: 不存Position,而由depth和屏幕像素坐标反推出来.參 ...

  3. oss

    import oss2 ''' auth = oss2.Auth('您的AccessKeyId', '您的AccessKeySecret') bucket = oss2.Bucket(auth, '您 ...

  4. RDA PQ工具使用 (屏参调整)

    使用客户规格书,制作屏参文件. 注意:,必填区和计算区,必填区根据屏参的SPEC填写,具体的屏参文件参数通过点击“Calc Sync”生成. 如:HV320WHB-N81的SPEC: 打开“Color ...

  5. 将属性和方法添加到Date原型中

    <button onclick="myFunction()">点我</button> <script> Date.prototype.myMet ...

  6. Java源码——Integer

    最近在研究java的源代码,但是由于自己英语水平有限,所以想使用中文注释的方式把源码里的方法全部重写 一遍,下面是楼主整理出来的一小部分.我把整体的项目托管到GitHub上了,欢迎大家前去交流学习. ...

  7. 爬虫—Selenium使用

    Selenium使用 Selenium是一个自动化测试工具,可以驱动浏览器器执行特定的动作,如点击,下拉等.同时还可以获取浏览器当前呈现页面的源代码,可见即可爬. 1.准备 我们使用谷歌Chrome浏 ...

  8. MvcPager 分页控件

    官方教程: http://www.webdiyer.com/mvcpager

  9. daily_journal_3 the game of thrones

    昨晚追完了最爱的美剧(the game of thrones),哇,看到结局有点崩溃.果然还是美帝淫民开放,各种乱伦,在七夕收到的万点暴击就祝天下有情人就像剧中一样终是血亲. 昨天算是完成了git的复 ...

  10. 全面学习ORACLE Scheduler特性(8)Application抛出的Events

    4.2 Application抛出的Events 首先要说明,这里所说的Application是个代词,即可以表示ORACLE数据库之外的应用程序,也可以是ORACLE数据库中的PROCEDURE等对 ...