摘要:本文简要介绍Active Record 设计模式。Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射。 应用Active Record 时,每一个类的实例对象唯一对应一个数据库表的一行(一对一关系)。你只需继承一个abstract Active Record 类就可以使用该设计模式访问数据库,其最大的好处是使用非常简单,事实上,这个设计模式被很多ORM产品使用,例如:Laravel ORM Eloquent, Yii ORM, FuelPHP ORM or Ruby on Rails ORM. 本文将用一个简单的例子阐述Active Record 设计模式是如何工作的(这个例子非常简单,如果要应用的话还有许多工作要做。)

假设我们有一个MobilePhone类, 包含以下属性

我们会将MobilePhone类代表的数据通过Active Record 方式插入到数据库表中,其对应的数据库表为:

MobilePhone类的实现如下:

如上所示,MobilePhone继承ActiveRecordModel类, 并且包含了用于连接数据库的几个属性(username, password...).
以上代码看起来非常简单易用, 这些都得益于ActiveRecordModel类, 我们看下是如何实现的。

当我们设置类的属性的时候,__set()魔术方法会被自动调用,会将属性的名字及值写入到类成员$attributes中(这些属性名与表中的列名一致)。对于上面这个例子,我们直接在新建类对象的时候对$attributes成员进行了赋值(参见__construct()方法)。
接下来我们调用save方法$phone->save(); , save方法会调用insert方法并将$attributes作为参数传递给insert, 在insert方法中首先新建一个数据库连接,然后将$attributes构成的key => value键值对通过PDO插入到数据库中, 最后将插入的新行的id写入到$attributes中。

Update data

你可以通过修改一个model的成员来实现修改数据库中的某一行, 比如$model->update(array("newvalue"=>"value)) 或者你可以直接设置model的成员变量$model->newvalue = "value"然后执行$model->save(), 这两种方式都是有效的。
比如以下例子:

update实现原理如下:

如上,update方法会根据attributes成员新建一个PDO statement, 然后执行这个statement, 最后更新$attributes成员。

Find and update

我们也可以通过find 或者 where方法得到一个特定id对应的类实例,或者一个特定条件下得到一些类实例构成的数组。
例子:

得到一个id为77的phone对象。
ActiveRecordModel 中对应的实现为:

假如你想使用where 条件查询,可以这样做:

实现方式如下:

通过上面的例子,我们可以看到,ActiveRecord的实质就是将一个类的实例与数据库表中的一行关联起来了,将数据库表的列与类的attributes成员映射起来,并使用attributes的值进行数据库的查询和写入。

总结

ActiveRecord 设计模式非常简单易懂。但是缺少灵活性,实际中当你每次处理一张表时使用这个模式是可以的, 但是当你要处理很多关联表,类继承关系较为复杂的时候就会有很多问题,这种情况你可以使用Data Mapper模式,之后会写一个新的章节对其介绍。