0

0

数据源架构模式的活动记录

php中文网

php中文网

发布时间:2016-06-01 14:24:23

|

1082人浏览过

|

来源于php中文网

原创

【活动记录的意图】

一个对象,它包装数据表或视图中某一行,封装数据库访问,并在这些数据上增加了领域逻辑。

【活动记录的适用场景】

适用于不太复杂的领域逻辑,如CRUD操作等。

【活动记录的运行机制】

对象既有数据又有行为。其使用最直接的方法,将数据访问逻辑置于领域对象中。

活动记录的本质是一个领域模型,这个领域模型中的类和基数据库中的记录结构应该完全匹配,类的每个域对应表的每一列。

一般来说,活动记录包括如下一些方法:

1、由数据行构造一个活动记录实例;

2、为将来对表的插入构造一个新的实例;

3、用静态查找方法来包装常用的SQL查询和返回活动记录;

4、更新数据库并将活动记录中的数据插入数据库;

5、获取或设置域;

6、实现部分业务逻辑。

【活动记录的优点和缺点】

优点:

magento(麦进斗)
magento(麦进斗)

Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的

下载

1、简单,容易创建并且容易理解。

2、在使用事务脚本时,减少代码复制。

3、可以在改变数据库结构时不改变领域逻辑。

4、基于单个活动记录的派生和测试验证会很有效。

缺点:

1、没有隐藏关系数据库的存在。

2、仅当活动记录对象和数据库中表直接对应时,活动记录才会有效。

3、要求对象的设计和数据库的设计紧耦合,这使得项目中的进一步重构很困难

【活动记录与其它模式】

数据源架构模式之行数据入口:活动记录与行数据入口十分类似。二者的主要差别是行数据入口 仅有数据库访问而活动记录既有数据源逻辑又有领域逻辑。

【活动记录的PHP示例】

  1. /**
  2. * 企业应用架构 数据源架构模式之活动记录 2010-10-17 sz
  3. * @author phppan.p#gmail.com http://www.phppan.com
  4. * 哥学社成员(http://www.blog-brother.com/)
  5. * @package architecture
  6. */
  7. /**
  8. * 定单类
  9. */
  10. class Order {
  11.   /**
  12.    * 定单ID
  13.    * @var
  14.    */
  15.   private $_order_id;
  16.   /**
  17.    * 客户ID
  18.    * @var
  19.    */
  20.   private $_customer_id;
  21.   /**
  22.    * 定单金额
  23.    * @var
  24.    */
  25.   private $_amount;
  26.   public function __construct($order_id, $customer_id, $amount) {
  27.     $this->_order_id = $order_id;
  28.     $this->_customer_id = $customer_id;
  29.     $this->_amount = $amount;
  30.   }
  31.   /**
  32.    * 实例的删除操作
  33.    */
  34.   public function delete() {
  35.     $sql = "DELETE FROM Order SET WHERE order_id = " . $this->_order_id . " AND customer_id = " . $this->_customer_id;
  36.     return DB::query($sql);
  37.   }
  38.   /**
  39.    * 实例的更新操作
  40.    */
  41.   public function update() {
  42.   }
  43.   /**
  44.    * 插入操作
  45.    */
  46.   public function insert() {
  47.   }
  48.   public static function load($rs) {
  49.     return new Order($rs['order_id'] ? $rs['order_id'] : NULL, $rs['customer_id'], $rs['amount'] ? $rs['amount'] : 0);
  50.   }
  51. }
  52. class Customer {
  53.   private $_name;
  54.   private $_customer_id;
  55.   public function __construct($customer_id, $name) {
  56.     $this->_customer_id = $customer_id;
  57.     $this->_name = $name;
  58.   }
  59.   /**
  60.    * 用户删除定单操作 此实例方法包含了业务逻辑
  61.    * 通过调用定单实例实现
  62.    * 假设此处是对应的删除操作(实际中可能是一种以某字段来标记的假删除操作)
  63.    */
  64.   public function deleteOrder($order_id) {
  65.     $order = Order::load(array('order_id' => $order_id, 'customer_id' => $this->_customer_id));
  66.     return $order->delete();
  67.   }
  68.   /**
  69.    * 实例的更新操作
  70.    */
  71.   public function update() {
  72.   }
  73.   /**
  74.    * 入口类自身拥有插入操作
  75.    */
  76.   public function insert() {
  77.   }
  78.   public static function load($rs) {
  79.     /* 此处可加上缓存 */
  80.     return new Customer($rs['customer_id'] ? $rs['customer_id'] : NULL, $rs['name']);
  81.   }
  82.   /**
  83.    * 根据客户ID 查找
  84.    * @param integer $id  客户ID
  85.    * @return Customer 客户对象
  86.    */
  87.   public static function find($id) {
  88.     return CustomerFinder::find($id);
  89.   }
  90. }
  91. /**
  92. * 人员查找类
  93. */
  94. class CustomerFinder {
  95.   public static function find($id) {
  96.     $sql = "SELECT * FROM person WHERE customer_id = " . $id;
  97.     $rs = DB::query($sql);
  98.     return Customer::load($rs);
  99.   }
  100. }
  101. class DB {
  102.   /**
  103.    * 这只是一个执行SQL的演示方法
  104.    * @param string $sql  需要执行的SQL
  105.    */
  106.   public static function query($sql) {
  107.     echo "执行SQL: ", $sql, "
    "
    ;
  108.      if (strpos($sql, 'SELECT') !== FALSE) { // 示例,对于select查询返回查询结果
  109.       return array('customer_id' => 1, 'name' => 'Martin');
  110.     }
  111.   }
  112. }
  113. /**
  114. * 客户端调用
  115. */
  116. class Client {
  117.   /**
  118.    * Main program.
  119.    */
  120.   public static function main() {
  121.     header("Content-type:text/html; charset=utf-8");
  122.     /* 加载客户ID为1的客户信息 */
  123.     $customer = Customer::find(1);
  124.     /* 假设用户拥有的定单id为 9527*/
  125.     $customer->deleteOrder(9527);
  126.   }
  127. }
  128. Client::main();
  129. ?>

同前面的文章一样,这仅仅是一个活动记录的示例,关于活动记录模式的应用,可以查看Yii框架中的DB类,在其源码中有一个CActiveRecord抽象类,从这里可以看到活动记录模式的应用

另外,如果从事务脚本中创建活动记录,一般是首先将表包装为入口,接着开始行为迁移,使表深化成为活动记录。

对于活动记录中的域的访问和设置可以如yii框架一样,使用魔术方法__set方法和__get方法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.5万人学习

Vue核心技术实战教程全套完整版
Vue核心技术实战教程全套完整版

共75课时 | 10万人学习

独孤九贱(6)_jQuery视频教程
独孤九贱(6)_jQuery视频教程

共44课时 | 34.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号