`
lyunabc
  • 浏览: 551477 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Yii Framework 开发教程(27) 数据库-关联Active Record示例

 
阅读更多

我们已经了解了怎样使用 Active Record (AR) 从单个数据表中获取数据。 在本节中,我们讲解怎样使用 AR 连接多个相关数据表并取回关联(join)后的数据集。

为了使用关系型 AR,我们建议在需要关联的表中定义主键-外键约束。这些约束可以帮助保证相关数据的一致性和完整性。

本例通过修改Yii Framework 开发教程(25) 数据库-Query Builder示例来介绍多个有关系的表如何使用Active Record。

在我们使用 AR 执行关联查询之前,我们需要让 AR 知道一个 AR 类是怎样关联到另一个的。

两个 AR 类之间的关系直接通过 AR 类所代表的数据表之间的关系相关联。 从数据库的角度来说,表 A 和 B 之间有三种关系:一对多(one-to-many,例如tbl_usertbl_post),一对一( one-to-one 例如tbl_usertbl_profile)和 多对多(many-to-many 例如tbl_categorytbl_post)。 在 AR 中,有四种关系:

  • BELONGS_TO(属于): 如果表 A 和 B 之间的关系是一对多,则 表 B 属于 表 A (例如Post属于User);
  • HAS_MANY(有多个): 如果表 A 和 B 之间的关系是一对多,则 A 有多个 B (例如User有多个Post);
  • HAS_ONE(有一个): 这是HAS_MANY的一个特例,A 最多有一个 B (例如User最多有一个Profile);
  • MANY_MANY: 这个对应于数据库中的 多对多 关系。 由于多数 DBMS 不直接支持 多对多 关系,因此需要有一个关联表将 多对多 关系分割为 一对多 关系。 在我们的示例数据结构中,tbl_post_category就是用于此目的的。在 AR 术语中,我们可以解释MANY_MANYBELONGS_TOHAS_MANY的组合。 例如,Post属于多个(belongs to many)CategoryCategory有多个(has many)Post.

AR 中定义关系需要覆盖CActiveRecord中的relations()方法。此方法返回一个关系配置数组。每个数组元素通过如下格式表示一个单一的关系。

在Query Builder中我们使用了下面SQL查询语句

SELECT c.FirstName, c.LastName , c.Address,c.Email
FROM customer c
INNER JOIN
employee e
ON c.SupportRepId=e.EmployeeId
WHERE e.EmployeeId=4

涉及到两个表格Employee 和 Customer,Employee和Customer之间是一对多的关系,也就是说一个员工可以负责多个客户。Employee到Customer的关系为HAS_MANY, Customer到Employee的关系为HAS_ONE。因此可以定义Employee和Customer如下:

//Customer.php
class Customer extends CActiveRecord
{
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	public function tableName()
	{
		return 'Customer';
	}

}

//Employee.php
class Employee extends CActiveRecord
{
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	public function tableName()
	{
		return 'Employee';
	}

	public function relations()
	{
		return array(
			'customers'=>array(self::HAS_MANY, 'Customer', 'SupportRepId'),

			);
	}
}

因为本例只使用到由Employee查询对应的Customer,因此只为类定义了relations方法。对应的表和外键为Customer和SupportRepId。
然后修改SiteController的indexAction方法:

public function actionIndex()
{

	$employee=Employee::model()->findByPk(4);

	$this->render('index', array(
		'model' => $employee->customers,

		));
}

AR 类中的关系定义为每个关系向类中隐式添加了一个属性。在一个关联查询执行后,相应的属性将将被以关联的 AR 实例填充。因此由$employee->customers可以查询到Employee对应的Customers记录。
执行关联查询最简单的方法是读取一个 AR 实例中的关联属性。如果此属性以前没有被访问过,则一个关联查询将被初始化,它将两个表关联并使用当前 AR 实例的主键过滤。 查询结果将以所关联 AR 类的实例的方式保存到属性中。这就是传说中的 懒惰式加载(lazy loading,也可译为延迟加载) 方式,例如,关联查询只在关联的对象首次被访问时执行。
本例使用的为延迟加载,延迟加载在某些情况下并不高效。如果我们想获取 N 个帖子的作者,使用这种延迟加载将会导致执行 N 个关联查询。 这种情况下,我们应该改为使用 渴求式加载(eager loading)方式。
渴求式加载方式会在获取主 AR 实例的同时获取关联的 AR 实例。 这是通过在使用 AR 中的 find 或 findAll 方法时配合使用 with 方法完成的。例如:

$employee=Post::model()->with('customers')->findAll();

最后修改一下显示结果的View的代码:

<?php foreach($model as $customer)
{

	echo 'First Name:' . $customer->FirstName . '<br />';
	echo 'Last Name:' . $customer->LastName . '<br />';
	echo 'Address:' . $customer->Address . '<br />';
	echo 'Email:' . $customer->Email . '<br />';
	echo '---------------------- <br />';
}

 ?>

不同的数据对列名大小写处理方式不同,有的数据库区分大小写,保险起见,Customer的属性使用和列定义同样的大小写。

201212127005

本例下载

本例介绍了关联Active Record的最基本的用法,其它功能和属性可以参见Yii中文文档,此外如果借助类似CodeSmith这样的工具,如果能够自动生成数据库定义的ActiveRecord代码,就可以大大减轻程序员的代码手工编写工作量。

此外,使用Active Record的便利是以性能为代价的,通常情况下使用Active Record与使用DAO读写数据库性能相比要差一个级别。下表为一个参考值,查找200个演员和1000部电影。

方法 内存使用(M) 执行时间(秒)
Active Record 19.74 1.14109
Query Builder 17.98 0.35732
DAO 17.74 0.35038

分享到:
评论

相关推荐

    yii2-save-relations-behavior, 验证并保存相关的Active Record 模型.zip

    yii2-save-relations-behavior, 验证并保存相关的Active Record 模型 Yii2 Active Record 保存关系行为自动验证和保存相关的Active Record 模型。 特性支持 hasMany() 和 hasOne() 关系现有的相关模型一起工作支持...

    yii-advanced-app-2.0.36.tgz

    Yii 2 Advanced Application 是一个基于 Yii 2 框架的高级项目模板,适用于构建复杂的、多应用的 Web 应用程序。版本号 2.0.36 表示这是该框架的一个稳定版本,提供了许多改进和修复。这个 `.tgz` 文件是该模板的...

    yii-advanced-app-2.0.10.tgz

    这个版本是“yii-advanced-app-2.0.10.tgz”,它是一个压缩包,包含了 Yii 2 框架的高级应用模板,版本号为 2.0.10。这个版本可能包含了一些修复和改进,以提供更稳定和高效的开发环境。 Yii 2 是一个基于组件的高...

    yii1-ueditor-ext-1.1

    Yii1-UEditor-Ext-1.1 是一个专为Yii框架1.x版本设计的扩展插件,它将流行的富文本编辑器——百度UEditor整合到了Yii应用中。这个组件的目的是提供一个易于使用且功能丰富的文本编辑工具,使得开发者在处理用户内容...

    yii-advanced-app-2.0.4

    "yii-advanced-app-2.0.4" 是 Yii 2.0 框架的一个高级应用模板,适用于构建复杂的多层应用程序。这个版本是 2.0.4,意味着它包含了该框架在 2.0 主线版本中的第四次更新,通常会包含修复的错误、改进的性能以及可能...

    yii2-file-upload-master.zip

    Yii2.0是一个基于组件的高性能PHP框架,用于开发Web 2.0应用程序。这个"yii2-file-upload-master.zip"压缩包包含了一个针对Yii2.0框架的图片上传扩展,特别设计来支持异步加载缩略图功能。这种功能在现代网页应用中...

    Yii Framework 1.1.6

    2. **数据库支持**:Yii提供了一个强大的Active Record组件,使得操作数据库记录变得简单。它支持多种数据库,如MySQL、PostgreSQL、SQLite等,并且兼容PDO(PHP Data Objects)。 3. **缓存机制**:Yii内置了多种...

    Yii Framework API手册

    Yii Framework API手册是针对开发者的一款详尽参考资料,它包含了Yii框架的所有核心组件、类库以及扩展的使用方法和接口信息。Yii是一个高性能、基于组件的PHP框架,用于开发Web 2.0应用。API(Application ...

    yii-basic-app-2.0.5.tgz

    "yii-basic-app-2.0.5.tgz" 是一个压缩包,其中包含了Yii2框架的基础版(Basic App)的源代码,版本号为2.0.5。这个版本修复了一个重要的安全问题,具体涉及到`yii\web\ViewAction`类。 `yii\web\ViewAction`是Yii2...

    yii-docs-2.0-zh-cn.tar.gz

    这个"yii-docs-2.0-zh-cn.tar.gz"压缩包包含了Yii 2.0框架的中文离线HTML版文档,使得开发者无需互联网连接也能查阅详尽的指导和API参考。同时,它还提供了英文版本的离线HTML文档以及"yii-guide-2.0-zh-cn"官方中文...

    yii扩展--ip地址识别--QQWRY

    YII扩展 IP地址识别组件 采用QQWRY数据库 使用条件: 解压到相应的目录。 确定QQWRY.DAT 放入 protacted/data 确定IpLocation 放入 protacted/components 修改main.php 'components'=&gt;array( //......

    YII Framework框架教程之使用YIIC快速创建YII应用详解

    主要介绍了YII Framework框架教程之使用YIIC快速创建YII应用的方法,详细分析说明了YII Framework框架使用YIIC命令行创建应用的相关技巧与注意事项,需要的朋友可以参考下

    yiren-p8Yii-ve2467575-x64.apk

    yiren-p8Yii-ve2467575-x64.apk

    yii-advanced-app-2.0.11.tgz

    这个名为 "yii-advanced-app-2.0.11.tgz" 的压缩包包含了所有必要的文件和配置,使得开发者可以快速地搭建起基于Yii 2的多层架构项目。 Yii 2.0框架是Yii框架的最新迭代,它在性能、安全性和可扩展性方面都有显著...

    YiiFramework

    - 数据库支持:支持多种数据库,如MySQL、PostgreSQL、SQLite等,并提供了Active Record模式,方便数据库操作。 - 错误和异常处理:提供了一套强大的错误和异常处理机制,确保应用在出现问题时能够优雅地处理。 -...

    yii-basic-app-2.0.0.tgz

    在"yii-basic-app-2.0.0.tgz"这个压缩包中,我们看到的是Yii 2.0框架的基础应用模板。这个模板是专门为初学者和快速原型设计准备的,包含了创建一个基本Web应用所需的所有基础结构。它提供了一个起点,开发者可以在...

    YII 2数据库迁移(Migrations) 使用教程

    ### YII 2数据库迁移(Migrations) 使用教程 #### 一、数据库迁移概念与作用 在软件开发过程中,随着项目的推进和技术需求的变化,数据库结构往往也需要进行调整或更新。为了更好地管理和跟踪这些变更,YII 2框架...

    yii-basic-app-2.0.36.tgz

    4. **数据库支持**:Yii2提供了强大的Active Record ORM(对象关系映射),支持多种数据库系统,包括MySQL、PostgreSQL、SQLite等。 5. **RESTful API**:Yii2支持轻松构建RESTful Web服务,便于移动应用和其他服务...

    yii快速入门教程--一个非常好的php框架

    ### Yii快速入门教程知识点 #### 一、基本概念 **1. 入口文件** - **功能**: 入口文件是整个Yii应用的第一个脚本,它负责加载Yii框架以及初始化应用。 - **内容**: 通常包含如下代码: ```php $yii = dirname...

Global site tag (gtag.js) - Google Analytics