`
stevecj
  • 浏览: 104418 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Yii框架中ActiveRecord使用Relations

    博客分类:
  • PHP
阅读更多
Yii框架中ActiveRecord使用Relations

  • 前提条件

在组织数据库时,需要使用主键与外键约束才能使用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)

 

Var NameRelation TypeClass NameForeign Key
关系名
四种关系: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对,是用来定制关系查询的,总结如下:

select
定义从AR类中被select的列集合,如果定义为*,则表示查询所有列
condition
定义where语句,默认为空。
params
生成SQL语句的参数,这个需要用一个key-value对的数组来表示;
on
ON语句,这个条件用来通过AND添加一个joining condintion语句
order
ORDER语句
with
和当前对象一起导出的相关对象列表,要注意如果使用不正确,有可能导致无限死循环;
joinType
定义join的类别,默认为LEFT OUTER JOIN
alias
定义别名,当多个表中有相同的column name时,需要为表格定义alias,然后使用tablename.columnname来指定不同的column
together
这个只在HAS_MANY, MANY_MANY时有用,在实现跨表查询时,可以用这个参数来控制性能。正常用不到,不详细讲述;
join
JOIN语句
group
GROUP语句
having
HAVING语句
index
这个值用来设定返回的结果数组以哪个column做为index值,如果不设定这个值的话,将从0开始组织结果数组。

除此之外还包含下面几个选项,在“懒惰导出”的特定关系时可用 

limit
返回结果数量的限制,不适用于BELONG_TO关系
offset
offset结果数量的值,不适用于BELONG_TO关系

下面代码,显示上面选项的一些使用:

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信息

分享到:
评论
1 楼 沉醉音乐的咖啡 2015-02-25  
引用
  

相关推荐

    yii框架yii框架yii框架yii框架yii框架

    很好用yii框架很好用yii框架很好用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框架中文

    php开发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最新框架YII框架

    据说是超越所有的PHP框架php最新框架YII框架php最新框架YII框架

    Yii框架学习手册

    Yii Yii框架 Yii框架快速入门,自己整理的很全的,很容易看懂

    yii 框架中文帮助文档

    YII框架的开发中文文档,帮助哪些正在学习YII框架的同学们,

    yii框架中文手册教程

    yii框架中文手册教程,Yii 是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。它将 Web 编程中的可重用性发挥到极致, 能够显著加速开发进程。Yii(读作“易”)代表简单(easy)、高效(efficient)、可扩展...

    Yii框架PDF中文文档

    Yii框架中文文档,完全中文,无英文章节。排版是我和同学亲手做的,另外我还制作了一个封面。文档没有加密,可以自由打印、修改。

    yii框架入门实例

    yii框架入门实例

    yii框架教程

    yii框架教程yii框架教程yii框架教程yii框架教程yii框架教程yii框架教程

    yii框架中文手册

    Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。

    Yii 框架简介,主流PHP框架,值得学习。

    Yii 框架简介 全面轻松入手Yii 从这里开始 简单 明了 言简意赅

    yii框架中文手册教程和YII模板

    yii框架中文手册教程和YII模板 我很辛苦才找到的

    php编程使用的yii框架,对php开发非常有用,快速搭建php项目

    php编程使用的yii框架,对php开发非常有用,快速搭建php项目,存在案例及使用方法。php编程使用的yii框架,对php开发非常有用,快速搭建php项目,存在案例及使用方法。php编程使用的yii框架,对php开发非常有用,...

    yii框架中文手册及中文教程手册

    yii框架中文手册及中文教程手册,中文教程介绍yii框架是什么,如何配置,中文手册集成所以的参数

    yii框架(1.1.15)

    这是yii框架修复1.1.14漏洞后的最新版本1.1.15

Global site tag (gtag.js) - Google Analytics