- 浏览: 104418 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
沉醉音乐的咖啡:
引用
Yii框架中ActiveRecord使用Relations -
stevecj:
呵呵,这个以后再交流。
盛大开始行动了,值得尊敬 -
庄表伟:
谢谢鼓励!我们会更加努力的。能聊聊你想做的另一个新产品是什么吗 ...
盛大开始行动了,值得尊敬
- 前提条件
在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作;
- 场景
申明关系
两张表之间的关系无非三种:一对多;一对一;多对多; 在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 | 这个对应多对多的情况,在AR里会将多对多以BELONGS_TO和HAS_MANY的组合来解释 | Post和Category |
在AR中通过重写CActiveRecord类的relations()方法来申明关系;这个方法返回一个关系配置的数组;一个数组无素代表一个单独的关系,格式如下:
'VarName'=>array('RelationType','ClassName','ForeignKey', ...additional options)
关系名 |
四种关系:self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY, self::MANY_MANY |
代表当前AR类要关联的那个AR类名 |
实现关系的外键, 有可能有多个,即列名 |
下面的代码表示用来定义Post, User之间的关系
class Post extends CActiveRecord { ...... public function relations() { return array( 'author'=>array(self::BELONGS_TO, 'User', 'author_id'), 'categories'=>array(self::MANY_MANY, 'Category', 'tbl_post_category(post_id, category_id)'), ); } } class User extends CActiveRecord { ...... public function relations() { return array( 'posts'=>array(self::HAS_MANY, 'Post', 'author_id'), 'profile'=>array(self::HAS_ONE, 'Profile', 'owner_id'), ); } }
使用时,如果$author代表一个USER的AR实例,可以使用$author->posts来获取到它相关的所有的Post对象。
执行关系查询
懒惰导入查询方法
最简单的方法就是为AR对象添加一个关联属性,
例:
// 获取PK为10的POST对象 $post=Post::model()->findByPk(10); // 获取这个POST的作者 $author=$post->author;
如果没有关联的对象,那么将返回NULL或者一个空数组;BELONGS_TO和HAS_ONE结果为NULL,而HAS_MANY和MANY_MANY返回一个空数组。
上面的这种“懒惰导入”方法使用起来非常方便,但是在一些场景下不是非常的效率,比如,如果我们想访问N个POST的作者的信息,使用这种懒惰导入的方法将会执行N个join查询;
急切导入查询方法
下面介绍是一种“急切导入”方法:在使用find和findAll时,使用with()方法,例:
$posts=Post::model()->with('author')->findAll()
这样就可以在一次查询时连同查询其他信息了;with方法可以接受多个关系:
$posts=Post::model()->with('author','categories')->findAll();
这样就可以将作者和类别的信息一并进行查询;同样,with还支持多重急切导入
$posts=Post::model()->with( 'author.profile', 'author.posts', 'categories')->findAll();
上面的代码不仅会返回autho和categories信息,还会返回作者的profile和posts信息这种“急切导入”方法也支持CDbCriteria::with,下面这两种实现方式效果一样:
$criteria=new CDbCriteria; $criteria->with=array( 'author.profile', 'author.posts', 'categories', ); $posts=Post::model()->findAll($criteria); or $posts=Post::model()->findAll(array( 'with'=>array( 'author.profile', 'author.posts', 'categories', ) );
关系查询选项
前面提过,在申明关系时可以添加额外的选项,这些选项都是一些key-value对,是用来定制关系查询的,总结如下:
除此之外还包含下面几个选项,在“懒惰导出”的特定关系时可用
下面代码,显示上面选项的一些使用:
class User extends CActiveRecord { public function relations() { return array( 'posts'=>array(self::HAS_MANY, 'Post', 'author_id', 'order'=>'posts.create_time DESC', 'with'=>'categories'), 'profile'=>array(self::HAS_ONE, 'Profile', 'owner_id'), ); } }
此时,我们使用$author->posts时,会返回固定ORDER的POST信息
发表评论
-
Yii CDBHttpSession数据库存储session性能优化实战
2011-09-14 20:11 879Yii CDBHttpSession数据库存储session性 ... -
YII CACHE使用示例
2011-08-29 21:58 3930从Boylee那抄过来的.链接中有boylee的博客地址. 我 ... -
Yii CDBHttpSession数据库存储session性能优化实战
2011-08-29 21:36 4171Yii CDBHttpSession数据库存储session性 ... -
通过扩展CWebUser添加信息到Yii:app()->user
2011-08-29 21:21 3500通过扩展CWebUser添加信息到Yii:app()-> ... -
通过扩展 CWebUser 增加信息到 Yii::app()->user
2011-05-25 11:16 7554通过扩展 CWebUser 增加信息到 Yii::app()- ... -
Gridview日期过滤列(filter date column for gridview in Yii framework)
2011-05-23 11:02 5062Gridview日期过滤列(filter da ... -
利用yii framework dropdown 创建级联菜单
2011-05-23 10:57 2355利用yii framework dropdown 创建级联菜单 ... -
如何开发Yii的中文网站
2011-05-23 10:50 5069如何开发Yii的中文网站 首先在配置文件main.php 中 ... -
Yii CGridView 详解(关键看关联表字段排序部分)
2011-05-23 10:47 6915Yii CGridView 详解(关键看关联表字段排序部分) ... -
总结一下隐藏index.php文件的步骤
2011-05-23 10:07 1515总结一下隐藏index.php文件的步骤 1.开启apache ... -
Yii Framework的CPagination用法详解
2011-05-22 17:52 3235Yii Framework的CPagination用法详解 c ... -
YII TIPS
2011-05-22 17:12 1410db组件 'schemaCachingDuration'=&g ... -
yii ajax分页
2011-05-22 16:24 1819我们有时候需要ajax读取数据,并进行分页。首先我们遇到的是如 ... -
yii中widget分页的用法
2011-05-22 16:15 4115yii中widget分页的用法 1首先contr ... -
YII全局函数使用
2011-05-21 08:57 4593由于YII致力于完美的整合第三方库,它并没有定义任何全局函数。 ... -
转:关于yii的relations
2011-05-20 16:53 2539关于yii的relations . ... -
使用GD库生成验证码
2011-05-14 21:19 1142GD库在php 中的另一个重要的应用,是使用GD库生 ... -
smarty插件:在多少分钟前,多少小时前,多少天前。
2011-05-14 21:11 1226smarty插件:在多少分钟前,多少小时前,多少天前。 ... -
yii快速入门与参考
2011-05-04 09:17 5480yii快速入门与参考 ...
相关推荐
很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架
yii1.1中文文档 yii框架中文手册教程.pdf
YII框架中文手册,希望帮助需要帮助的人!
YII框架中文手册教程,YII框架中文,YII框架中文手册,YII框架中文教程,YII框架中文手册教程,YII框架中文,YII框架中文手册,YII框架中文
yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架yii框架
本书不是简单地介绍如何使用 Yii 框架,而是站在框架设计的高度,从源代码级别深 度剖析。本书首先介绍 PHP 框架技术的概念及其应用领域,然后开始仿照 Yii 框架源代码 自定义框架,其中包括了 MVC 设计模式、单入口...
据说是超越所有的PHP框架php最新框架YII框架php最新框架YII框架
Yii Yii框架 Yii框架快速入门,自己整理的很全的,很容易看懂
YII框架的开发中文文档,帮助哪些正在学习YII框架的同学们,
yii框架中文手册教程,Yii 是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。它将 Web 编程中的可重用性发挥到极致, 能够显著加速开发进程。Yii(读作“易”)代表简单(easy)、高效(efficient)、可扩展...
Yii框架中文文档,完全中文,无英文章节。排版是我和同学亲手做的,另外我还制作了一个封面。文档没有加密,可以自由打印、修改。
yii框架入门实例
yii框架教程yii框架教程yii框架教程yii框架教程yii框架教程yii框架教程
Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。
Yii 框架简介 全面轻松入手Yii 从这里开始 简单 明了 言简意赅
yii框架中文手册教程和YII模板 我很辛苦才找到的
php编程使用的yii框架,对php开发非常有用,快速搭建php项目,存在案例及使用方法。php编程使用的yii框架,对php开发非常有用,快速搭建php项目,存在案例及使用方法。php编程使用的yii框架,对php开发非常有用,...
yii框架中文手册及中文教程手册,中文教程介绍yii框架是什么,如何配置,中文手册集成所以的参数
这是yii框架修复1.1.14漏洞后的最新版本1.1.15