• PHP : ActiveRecord实现示例


    先简单介绍一下Active Record:

    Active Record(中文名:活动记录)是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。Active Record 和 Row Gateway (行记录入口)十分相似,但前者是领域模型,后者是一种数据源模式。关系型数据库往往通过外键来表述实体关系,Active Record 在数据源层面上也将这种关系映射为对象的关联和聚集。
    Active Record 适合非常简单的领域需求,尤其在领域模型和数据库模型十分相似的情况下。如果遇到更加复杂的领域模型结构(例如用到继承、策略的领域模型),往往需要使用分离数据源的领域模型,结合 Data Mapper (数据映射器)使用。
    Active Record 驱动框架一般兼有 ORM 框架的功能,但 Active Record 不是简单的 ORM,正如和 Row Gateway 的区别。著名的例子是全栈(Full Stack) Web 开发框架 Ruby on Rails ,其默认使用一个纯 Ruby 写成的 Active Record 框架来驱动 MVC 中的模型层。
    在 Martin Fowler 的 《企业应用架构模式》 一书中曾详细叙述了本模式。
    以下是著名的 Active Record 驱动框架:
    SQLObject(Python)
    Ruby on Rails ActiveRecord (Ruby)
    Yii Framework ActiveRecord (PHP)
    Castle ActiveRecord (.NET)
    帮助理解active record代码  收藏代码
    1. <?php  
    2. define('DBHOST', 'localhost');  
    3. define('DBUSER', 'root');  
    4. define('DBPASS', '');  
    5. define('DBNAME', 'test');  
    6. define('TABLE_PREFIX', 't_');  
    7. class ActiveRecord {  
    8.     private $tablepre;  
    9.     private $class;  
    10.     private $table;  
    11.     private static $link;  
    12.     private $data;  
    13.       
    14.     public $primaryKey = 'id';  
    15.       
    16.     public function __construct() {  
    17.         $this->tablepre = TABLE_PREFIX;  
    18.         $this->class = get_class($this);  
    19.         $this->table = $this->tablepre . strtolower($this->class);  
    20.         $this->data = array();  
    21.         $this->connect();  
    22.     }  
    23.       
    24.     private function connect() {  
    25.         if(!self::$link) {  
    26.             self::$link = mysql_connect(DBHOST, DBUSER, DBPASS);  
    27.             mysql_select_db(DBNAME);  
    28.         }  
    29.         return self::$link;  
    30.     }  
    31.       
    32.     public function __set($name, $value) {  
    33.         $this->data[$name] = $value;  
    34.     }  
    35.       
    36.     private function implodefields($cond) {  
    37.         $fields = array();  
    38.         foreach($cond as $key => $value) {  
    39.             $value = mysql_real_escape_string($value);  
    40.             $fields[] = "`$key`='$value'";  
    41.         }  
    42.         return implode(', ', $fields);  
    43.     }  
    44.       
    45.     public function add() {  
    46.         $fields = $this->implodefields($this->data);  
    47.         $sql = "INSERT INTO `{$this->table}` SET $fields";  
    48.         $this->query($sql);  
    49.     }  
    50.       
    51.     public function findById($id) {  
    52.         $sql = "SELECT * FROM `{$this->table}` WHERE `{$this->primaryKey}`='$id' LIMIT 1";  
    53.         $data = $this->getOne($sql);  
    54.         return $this->makeObjFromArray($data);  
    55.     }  
    56.       
    57.     private function makeObjFromArray($data) {  
    58.         $obj = new $this->class;  
    59.         foreach($data as $key => $value) {  
    60.             $obj->$key = $value;  
    61.         }  
    62.         return $obj;  
    63.     }  
    64.       
    65.     private function query($sql) {  
    66.         echo $sql . " ";  
    67.         return mysql_query($sql, self::$link);  
    68.     }  
    69.       
    70.     private function getOne($sql) {  
    71.         $data = $this->query($sql);  
    72.         if($data) {  
    73.             $item = mysql_fetch_assoc($data);  
    74.             return $item;  
    75.         }  
    76.         return false;  
    77.     }  
    78. }  
    79.   
    80. class User extends ActiveRecord {  
    81.     var $primaryKey = 'id';  
    82. }  
    83.   
    84. $user = new User();  
    85. $user->name = '热电影';  
    86. $user->email = 'www.redianying.com';  
    87. $user->add();  
    88.   
    89. $user = $user->findById(1);  
    90. print_r($user);   
     
  • 相关阅读:
    JAVA,统计字符串里面每个字符出现的次数
    JAVA,遍历HashMap的2种方式,keySet方法和entrySet对象
    JAVA,Map接口常用方法
    JAVA,Collection集合常用API和集合特点
    object类常用方法
    [Algorithm] 双指针应用
    [CV]计算机视觉中值变换、拉普拉斯算子、傅里叶变换
    [CNBlogs]使用Typora和MetaWeblog改善博客园书写体验
    [C#] 动态编程表达式树实现NPOI.IROW快速映射优化
    [CV] 计算机视觉像素位变换(反转变换、对数变换,伽马变换,直方图均衡化)
  • 原文地址:https://www.cnblogs.com/hellowzd/p/4674142.html
Copyright © 2020-2023  润新知