0

0

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

黄舟

黄舟

发布时间:2017-01-22 09:30:55

|

1645人浏览过

|

来源于php中文网

原创

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

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

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

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

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

立即学习PHP免费学习笔记(深入)”;

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_MANY 为 BELONGS_TO 和 HAS_MANY 的组合。 例如 ,Post 属于多个(belongs to many) Category ,Category 有多个(has many) Post.

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

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

Groq
Groq

GroqChat是一个全新的AI聊天机器人平台,支持多种大模型语言,可以免费在线使用。

下载
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.phpclass Customer extends CActiveRecord{
public static function model($className=__CLASS__){return parent::model($className);}
public function tableName(){return 'Customer';}
}
//Employee.phpclass 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的代码:

$customer){
echo 'First Name:' . $customer->FirstName . '';
echo 'Last Name:' . $customer->LastName . '';
echo 'Address:' . $customer->Address . '';
echo 'Email:' . $customer->Email . '';
echo '----------------------';}
?>

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

673.jpg

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

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

674.png

以上就是PHP开发框架Yii Framework教程(27) 数据库-关联Active Record示例的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

yii

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

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

精品课程

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

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