The DoYouHaoBaby PHP Framework中文开发文档手册
Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
[ ActiveRecord ]
前言

互连网时代Web 程序大量涌现,而几乎所有的Web 程序都存在对象和关系数据库。业务逻辑层和用户界面层是面向对象的;当对象信息发生变化的时候,需要把对象的信息保存在关系数据库中。关系数据库建立在数学集合理论之上,这使得关系数据库与面向对象编程语言很难融为一体。为了解决这类问题,对象/关系映射( Object-RelationalMapping ,ORM )模型应用而生。
 

对象/关系映射

 对象/关系映射,用来把对象模型表示的对象映射到基于SQL 的关系模型数据库结构中去。ORM 将数据库表映射到类、将记录映射到对象、将字段映射到对象的属性。类方法用于执行表级别的操作,实例方法用于执行对单条记录的操作。ORM 技术在对象和关系之间架起了一座桥梁,前台的对象型数据和数据库中的关系型数据通过这个桥梁来相互转化,让应用能够直接持久化于对象中,而不要求开发人员在对象和关系格式之间进行转换,从而简化了数据库的操作和缩短了开发时间,并使得程序更容易维护和扩展。
 

Active Record

Active Record 最早是由Martin Fowler提出的一种ORM 设计模式。Martin Fowler对Active Record 的描述是:“包括数据库或视图中数据行的对象,封装数据库访问,在数据上添加域逻辑”。Active Record 封装了数据表或视图中的一行数据,封装了它的数据库访问行为,并加入了该数据的业务逻辑。也可以这样认为:Active Record 是加入了数据库访问行为的领域对象( Domain Object )。

Active Record 通常要实现下面的方法:

(1)通过SQL查询结果构造一个ActiveRecord 实例。

(2)为插入数据库操作预先生成一个Active Record 实例。

(3)静态的Finder 方法,返回Active Record对象。

(4)通过Active Record 对象Update 数据库和Insert 数据库。

(5)Get/Set 数据域。

(6)实现一些业务逻辑。

 

ActiveRecord 原理


 ActiveRecord 通过一些非常直观的命名规则和动态的反射实现了模型对象封装数据库中的一行数据并提供CRUD 的默认操作。当创建一个ActiveRecord::Base的子类时便和数据库中以类名的复数形式作为表名的表建立了映射,ActiveRecord会在运行时动态判断数据库中有哪些字段,并将数据库结构反映在对应的模型类。ActiveRecord 从数据库中读取信息时,会使用读取的结果构造一个模型对象,此读取的结果数据便是该对象属性数据。ActiveRecord 的模型类通过继承ActiveRecord:Base 类,获得CRUD操作的默认处理。

ActiveRecord 通过数据库创建特定命名约定的字段和申明相应方法可以很方便地实现数据库表间的关联,同时也为模型对象增加了特定的方法。只要在模型类中定义继承体系,并确保与基类对应的数据库表包含继承体系所有的属性字段,以及用于描述每条记录所对应对象型的附加字段(type 字段),ActiveRecord 便可以实现单表继承(Single Table Inheritance)。ActiveRecord 可在保存对象时自动地对模型对象进行校验。ActiveRecord 借助回调方法(Callback) 可以编写代码参与到模型对象的生命周期中,实现更复杂的
校验、将数据库中保存的值映射成自定义的值以及阻止某些操作。
 

Active Record 的特点

(1)习惯约定优于配置( Convention OverConfiguration )

Active Record程序除连接数据库需要写一个简单的文件外,几乎不需要任何配置信息。当然,如果不满意ActiveRecord 缺省命名惯例,也可以通过编写极少的代码指定模型类与数据库间的映射。



(2)动态地反应数据库

ActiveRecord 不需要映射文件就可以通过数据库与模型类建立映射。ActiveRecord在首次使用某个模型对象时,会先访问数据库,将数据库中数据表的属性映射为对象的属性,从而ActiveRecord 可以动态的反应数据库。因此,当修改了数据库表的结构时,会立即反应到模型类中,不需要修改模型类的任何代码。