【前言】

在之前学习框架时介绍过

(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. Watcher 实现机制之client注冊

    Zookeeper 提供的了分布式数据的公布/订阅功能,通过 Watch 机制来实现这样的分布式的通知功能. Zookeeper 同意client向server注冊一个Watch监听.当服务端的一些指 ...

  2. C Language Study - gets , getchar & scanf

    慢慢的发现C语言功底是如此的薄弱,被这几个字符输入函数搞糊涂了又~~ 来,再来忧伤一次吧~ 那么.我们从scanf開始: 假如说你要将一串字符输入到一字符数组里,例如以下面程序, char a[2]; ...

  3. JSON入门指南

    JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,很适合于server与 JavaScript 的交互.本文将高速解说 JSON 格式.并通过代码演示样 ...

  4. iOS开发——高级篇——线程同步、线程依赖、线程组

    前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...

  5. iOS开发——基础篇——assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  6. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)

    [Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...

  7. 求欧拉回路 UOJ117

    传送门什么是欧拉回路呢……?欧拉回路的定义就是从vi出发到vi,经过每条边有且只有一次的路径. 就很像一笔画. 欧拉回路的性质较多……定理也很多……直接证明很长……我们还是直接说怎么判定,怎么求欧拉回 ...

  8. 4.7.4 Constructing LALR Parsing Tables

    4.7.4 Constructing LALR Parsing Tables We now introduce our last parser construction method, the LAL ...

  9. 安装完Anaconda python 3.7,想使用python3.6方法

    cmd使用命令: conda create -n py36 python=3.6 anaconda 安装好后,会有提示: To activate this environment, use:# > ...

  10. echart 参数 vue配置 图文展示

    https://blog.csdn.net/she_lover/article/details/51448967 https://blog.csdn.net/n_meng/article/detail ...