开源PHP开发框架Yii全方位教程 (11) Active Record (AR)

 

虽然Yii DAO可以处理事实上任何数据库相关的任务,但编写一些通用的SQL语句来执行CRUD操作(创建,读取,更新和删除)往往会让我们花费掉90%的时间。同时我们也很难维护这些PHP和SQL语句混合的代码。要解决这些问题,我们可以使用Active Record。
Active Record(AR)是一种流行的对象关系映射(ORM)技术。每个AR类代表一个数据表(或视图),数据表或者视图的字段作为AR类的属性,一个AR实例代表在表中的一行。常见的CRUD操作被作为AR类的方法执行。于是,我们可以使用更面向对象的方法处理我们的数据。例如,我们可以使用下面的代码在 tbl_post表中插入一个新行:

$post=new Post;
$post->title='sample post';
$post->content='post body content';
$post->save();

在下面我们将介绍如何设置AR和用它来执行CRUD操作。在下一小节我们将展示如何使用AR 处理数据库中的关联表。为了简单起见,在本节中,我们使用下面的数据库表作为例子。请注意,如果你使用MySQL数据库,您应该把下面SQL语句中的 AUTOINCREMENT替换为AUTO_INCREMENT。

CREATE TABLE tbl_post (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(128) NOT NULL,
    content TEXT NOT NULL,
    create_time INTEGER NOT NULL
);

AR不是要解决所有与数据库相关的任务。它最好用于在PHP结构中模型化数据表和执行不复杂的 SQL 语句. 而 Yii DAO 应该用于复杂的情况下。

建立数据库连接

AR需要一个数据库连接以执行数据库相关的操作。默认情况下,应用中的db组件提供了 CDbConnection实例作为我们需要的数据库连接。可参看如下配置:

return array(
    'components'=>array(
        'db'=>array(
            'class'=>'system.db.CDbConnection',
            'connectionString'=>'sqlite:path/to/dbfile',
            // turn on schema caching to improve performance
            // 'schemaCachingDuration'=>3600,
        ),
    ),
);

由于Active Record需要表的元数据来确定数据表的字段信息, 这需要时间来读取和分析元数据。如果您的数据库结构是比较固定的,你应该打开缓存。 打开方法是配置CDbConnection::schemaCachingDuration属性为一个大于0的值。

AR的支持受限于数据库管理系统。目前,只有以下数据库管理系统支持:

  • MySQL 4.1 或以后版本
  • PostgreSQL 7.3 或以后版本
  • SQLite 2 和 3
  • Microsoft SQL Server 2000 或以后版本
  • Oracle


Microsoft SQL Server自1.0.4版本提供支持;而对 Oracle 自1.0.5版本即提供支持。

如果你想使用其他组件而不是db,或者你使用 AR 访问多个数据库,你应该重写CActiveRecord::getDbConnection()。 CActiveRecord类是所有AR类的基类。

有两种方法可以在AR模式下使用多种数据库系统。如果数据库的模式不同, 您可以对getDbConnection()进行不同的实现,来创建不同的 AR 基类。否则,动态改变静态变量CActiveRecord::db 是一个更好的主意。

定义 AR 类

为了使用一个数据表,我们首先需要扩展CActiveRecord来定义一个AR类。每个AR类代表一个数据库表,每个AR实例代表数据表中的一行。下面的代码介绍了要创建一个对应tbl_post表的AR类所需要的最少的代码。

class Post extends CActiveRecord
{
        public static function model($className=<strong>CLASS</strong>)
        {
        return parent::model($className);
        }
        public function tableName()
        {
        return ’tbl_post’;
        }
}

因为AR类在很多地方被引用,我们可以导入包含AR类的整个目录,而不是逐个引入它们.例如,若我们所有的AR类文件位于 protected/models,我们可以如下配置:

return array(
  ’import’=>array(
      ’application.models.*’,
  ),
);

默认的, AR 类的名字和数据表的名字相同. 若它们不同需要重写 tableName() 方法. 每个AR类的model()方法都如此声明(会在稍后介绍).

要使用版本 1.1.0 引入的表前缀特征, AR 的方法 tableName() 可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Yii 2.0 权威指南 本教程的发布遵循 Yii 文档使用许可. 版权所有 2014 (c) Yii Software LLC. 介绍 已定稿 关于 Yii 已定稿 从 Yii 1.1 升级 入门 已定稿 安装 Yii 已定稿 运行应用 已定稿 第一次问候 已定稿 使用 Forms 已定稿 玩转 Databases 已定稿 用 Gii 生成代码 已定稿 更上一层楼 应用结构 已定稿 结构概述 已定稿 入口脚本 已定稿 应用 已定稿 应用组件 已定稿 控制器(Controller) 已定稿 视图(View) 已定稿 模型(Model) 已定稿 过滤器 已定稿 小部件(Widget) 已定稿 模块(Module) 已定稿 前端资源(Asset) 已定稿 扩展(extensions) 请求处理 已定稿 运行概述 已定稿 引导(Bootstrapping) 已定稿 路由(Route)引导与创建 URL 已定稿 请求(Request) 已定稿 响应(Response) 已定稿 Sessions(会话)和 Cookies 已定稿 错误处理 已定稿 日志 关键概念 已定稿 组件(Component) 已定稿 属性(Property) 已定稿 事件(Event) 已定稿 行为(Behavior) 已定稿 配置(Configurations) 已定稿 类自动加载(Autoloading) 已定稿 别名(Alias) 已定稿 服务定位器(Service Locator) 已定稿 依赖注入容器(DI Container) 配合数据库工作 编撰中 数据访问对象(DAO) - 数据库连接、基本查询、事务和模式操作 编撰中 查询生成器(Query Builder) - 使用简单抽象层查询数据库 编撰中 活动记录(Active Record) - 活动记录对象关系映射(ORM),检索和操作记录、定义关联关系 编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中 多模型同时输入 显示数据 编撰中 格式化输出数据 待定中 分页(Pagination) 待定中 排序(Sorting) 编撰中 数据提供器 编撰中 数据小部件 编撰中 主题 安全 编撰中 认证(Authentication) 编撰中 授权(Authorization) 编撰中 处理密码 待定中 客户端认证 待定中 安全领域的最佳实践 缓存 已定稿 概述 已定稿 数据缓存 已定稿 片段缓存 已定稿 分页缓存 已定稿 HTTP 缓存 RESTful Web 服务 已定稿 快速入门 已定稿 资源 已定稿 路由 已定稿 格式化响应 已定稿 授权验证 已定稿 速率限制 已定稿 版本化 已定稿 错误处理 已定稿 测试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值