`
dcj3sjt126com
  • 浏览: 1831738 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP : ActiveRecord实现示例

    博客分类:
  • PHP
php 
阅读更多

先简单介绍一下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)
<?php
define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', '');
define('DBNAME', 'test');
define('TABLE_PREFIX', 't_');
class ActiveRecord {
    private $tablepre;
    private $class;
    private $table;
    private static $link;
    private $data;
    
    public $primaryKey = 'id';
    
    public function __construct() {
        $this->tablepre = TABLE_PREFIX;
        $this->class = get_class($this);
        $this->table = $this->tablepre . strtolower($this->class);
        $this->data = array();
        $this->connect();
    }
    
    private function connect() {
        if(!self::$link) {
            self::$link = mysql_connect(DBHOST, DBUSER, DBPASS);
            mysql_select_db(DBNAME);
        }
        return self::$link;
    }
    
    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
    
    private function implodefields($cond) {
        $fields = array();
        foreach($cond as $key => $value) {
            $value = mysql_real_escape_string($value);
            $fields[] = "`$key`='$value'";
        }
        return implode(', ', $fields);
    }
    
    public function add() {
        $fields = $this->implodefields($this->data);
        $sql = "INSERT INTO `{$this->table}` SET $fields";
        $this->query($sql);
    }
    
    public function findById($id) {
        $sql = "SELECT * FROM `{$this->table}` WHERE `{$this->primaryKey}`='$id' LIMIT 1";
        $data = $this->getOne($sql);
        return $this->makeObjFromArray($data);
    }
    
    private function makeObjFromArray($data) {
        $obj = new $this->class;
        foreach($data as $key => $value) {
            $obj->$key = $value;
        }
        return $obj;
    }
    
    private function query($sql) {
        echo $sql . "\n";
        return mysql_query($sql, self::$link);
    }
    
    private function getOne($sql) {
        $data = $this->query($sql);
        if($data) {
            $item = mysql_fetch_assoc($data);
            return $item;
        }
        return false;
    }
}

class User extends ActiveRecord {
    var $primaryKey = 'id';
}

$user = new User();
$user->name = '热电影';
$user->email = 'www.redianying.com';
$user->add();

$user = $user->findById(1);
print_r($user); 

 

分享到:
评论

相关推荐

    yii2-activerecord-inheritance:ActiveRecord Inheritance是为Yii2框架提供类表继承模式的实用程序

    $ php composer.phar require jlorente/yii2-activerecord-inheritance " * " 或添加 ... " require " : { ... " jlorente/yii2-activerecord-inheritance " : " * " } 到composer.json文件的require部分。 ...

    Yii框架实现对数据库的CURD操作示例

    本文实例讲述了Yii框架实现对...//继承ActiveRecord实现CURD操作 class user extends ActiveRecord { } 后面的代码中命名空间都已经省略 namespace app\controllers; use yii\web\Controller; use app\models\use

    YII 数据库操作之 Active Record

     它的佳应用是模型化数据表为 PHP 结构和执行不包含复杂 SQL 语句的查询。 对于复杂查询的场景,应使用 Yii DAO  建立数据库连接  默认情况下, 它假定 db 应用组件提供了所需的 CDbConnection 数据库连接实例...

    todo-list-php

    Eloquent-Laravel附带的ORM提供了一个漂亮,简单的ActiveRecord实现,用于处理您的数据库 安装 Dillinger需要才能运行。 安装依赖项和devDependencies并启动服务器。 $ cd project $ php composer.phar install $...

    国内优秀框架ThinkPHP1.5.0新版+最新官方示例程序

    借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的Action思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作,单一入口模式等,在模版引擎、...

    thinkphp3源码带示例

    后来经过不断改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的Action和Dao思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些...

    JFinal 是基于 Java 语言的极速 WEB + ORM 框架,.rar

    JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、...以下是JFinal实现Blog管理的示例:

    YII2框架中分页组件的使用方法示例

    本文实例讲述了YII2框架中...use yii\db\ActiveRecord; class MyUser extends ActiveRecord { public static function tableName() { return '{{%user}}'; } } 然后创建分页的控制器: &lt;?php namespace app\

    YII2框架中ActiveDataProvider与GridView的配合使用操作示例

    本文实例讲述了YII2框架中ActiveDataProvider与GridView的配合使用操作。分享给大家供大家参考,具体如下: YII2中ActiveDataProvider可以使用yii\db\Query或yii\db\Active...use yii\db\ActiveRecord; use yii\data\

    yii2-ecom:Yii2的电子商务扩展

    有关使用示例,请参见使用此扩展的示例应用程序。 本指南假定您熟悉爱沙尼亚银行付款的实现(请参阅 ) 主要特点: 可扩展的代码,几乎所有内容都可以定制 与ActiveRecord对象(订单,产品)集成 购物篮功能...

    rex_eloquent:Redaxo 插件

    Illuminate Database 组件是一个完整的 PHP 数据库工具包,提供了一个富有表现力的查询构建器、ActiveRecord 风格的 ORM 和模式构建器。 特征 查询生成器 / 模式生成器 / Eloquent ORM 插入/更新/删除 软删除 日期...

    yii2-restmodel:Yii2的库,可让您针对REST服务而不是数据库查询模型(例如ActiveRecord)

    yii2-restmodel 将此仓库克隆到您的扩展名/文件夹中。 查看示例(您应将其复制到模型/文件夹中)

Global site tag (gtag.js) - Google Analytics