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 ]
.
ThinkPHP---AR模式的更多相关文章
- AR模式
AR模式 在ThinkPHP框架中,一共存在两种操作模式:ORM模式与AR模式 ORM模式:① 实例化模型 ② 创建数据对象组装数组 ③ 调用相关方法执行相关操作 AR模式:① 实例化模型 ② 把数据 ...
- 黑马lavarel教程---5、模型操作(AR模式)
黑马lavarel教程---5.模型操作(AR模式) 一.总结 一句话总结: AR: ActiveRecord :Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型 ...
- Spring boot+Mybatisplus用AR模式实现逻辑删除操作
Mybatisplus的AR模式 Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录.ActiveRecord ...
- ThinkPHP调试模式与日志记录
1.可以在config.php中进行设置,默认为关闭状态. 'APP_DEBUG' => true 打开\ThinkPHP\Common\debug.php文件可以查看debug的默认设置 ...
- ThinkPHP URL模式和URL重写
现在用的版本是TP3.1.3,这两天总是遇到NotFound的错误,解析路径错误,所以认真研究了一下手册,发现问题出在URL模式上面. URL模式 一般是使用U方法来生成路径,U方法的定义规则如下(方 ...
- thinkphp URL 模式
兼容ThinkPHP三种url模式的nginx rewrite location / { root /var/www; index index.html index.htm index.php; if ...
- centos7 nginx完整支持thinkphp pathinfo模式开启方法
thinkphp运行在linux+nginx,如何开启pathinfo模式,我是完整测试过了,没问题的,在thinkphp配置文件 开启 'URL_MODEL' => 1, 1代 ...
- thinkphp 应用模式
应用模式提供了对核心框架进行改造的机会,可以让你的应用适应更多的环境和不同的要求. 每个应用模式有自己的模式定义文件,用于配置当前模式需要加载的核心文件和配置文件,以及别名定义.行为扩展定义等等.根据 ...
- thinkphp 调试模式
ThinkPHP有专门为开发过程而设置的调试模式,开启调试模式后,会牺牲一定的执行效率,但带来的方便和除错功能非常值得. 直线电机哪家好直线电机生产厂家 我们强烈建议ThinkPHP开发人员在开发阶段 ...
- thinkphp cbd模式
ThinkPHP从3.0版本开始引入了全新的CBD(核心Core+行为Behavior+驱动Driver)架构模式,因为从底层开始,框架就采用核心+行为+驱动的架构体系,核心保留了最关键的部分,并在重 ...
随机推荐
- [计算机联网故障]WIFI接入正常,但是上网不正常(两种情况)
今天同事拿来一个笔记本,说是连接WIFI都正常,但是就是无法上网.换了单位的wifi和他自己的手机共享wifi都是无法上网. 我首先检查了一下IP地址设置,看是否指定了IP.没有. 然后取消IPv6. ...
- 【bzoj1150】[CTSC2007]数据备份Backup
将k对点两两相连,求最小长度 易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优 然后就可以用贪心来做这道题了.. 将初始所有的线段放进堆里 每次取最短的线段进行连接,且ans+=a[i ...
- HTTP要点概述:十一,HTTP状态码
一,状态码: 状态码告知从服务器返回的请求结果.用户借助状态码可以判断服务器是正常处理了请求,还是发生了错误. 状态码比如200 OK,以3位数字和原因短语组成. 数字中的第一位制定了相应的类别,后两 ...
- MPEG2、MPEG4、H264的差异
iso(国际标准化组织) MPEG系列 ITU-T(国际电联)h.系列 H.264:iso与ITU联合制定,数据压缩比超牛! MPEG-2简介 MPEG-2制定于1994年,设计目标是高级工业标准的图 ...
- golang中管道热替换
golang中管道替换问题 https://blog.csdn.net/cyk2396/article/details/78875347 1.运行以下代码: var chan1 chan int va ...
- 【HDU 4547】 CD操作
[题目链接] 点击打开链接 [算法] 分四种情况讨论 : 1. 当前目录和目标目录是同一目录,不需要变换,答案为0 2. 当前目录是目标目录的祖先,答案为当前目录的深度 - 目标目录的深度 3. 当前 ...
- Same origin policy
Chrome: Origin null is not allowed by Access-Control-Allow-Origin 的问题 发送 http request 时遇到 error: Ori ...
- 理解javascript中的事件模型
javascript中有两种事件模型:DOM0,DOM2.而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些. 一. DOM0级事件模型 DOM0级事件模型是早期的事件 ...
- attr 和 prop的区别和使用
一. attr和prop的区别 要想弄清楚attr和prop的区别,就要先搞清楚js中使用DOM方法获取设置属性和使用对象方法获取设置属性的区别. 在javascript中使用DOM方法设置获取属性值 ...
- bzoj 1426: 收集邮票【期望dp】
我太菜了,看的hzwer的blog才懂 大概是设f[i]表示已经拥有了i张邮票后期望还要买的邮票数,这个转移比较简单是f[i]=f[i]*(i/n)+f[i+1]*((n-i)/n)+1 然后设g[i ...