`

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之间的关系

[html] view plaincopy
 
  1. classPostextendsCActiveRecord
  2. {
  3. ......
  4. publicfunctionrelations()
  5. {
  6. returnarray(
  7. 'author'=>array(self::BELONGS_TO,'User','author_id'),
  8. 'categories'=>array(self::MANY_MANY,'Category',
  9. 'tbl_post_category(post_id,category_id)'),
  10. );
  11. }
  12. }
  13. classUserextendsCActiveRecord
  14. {
  15. ......
  16. publicfunctionrelations()
  17. {
  18. returnarray(
  19. 'posts'=>array(self::HAS_MANY,'Post','author_id'),
  20. 'profile'=>array(self::HAS_ONE,'Profile','owner_id'),
  21. );
  22. }
  23. }

使用时,如果$author代表一个USER的AR实例,可以使用$author->posts来获取到它相关的所有的Post对象。

 

 

执行关系查询

 

懒惰导入查询方法

最简单的方法就是为AR对象添加一个关联属性,
例:

[html] view plaincopy
 
  1. //获取PK为10的POST对象$post=Post::model()->findByPk(10);
  2. //获取这个POST的作者$author=$post->author;

如果没有关联的对象,那么将返回NULL或者一个空数组;BELONGS_TO和HAS_ONE结果为NULL,而HAS_MANY和MANY_MANY返回一个空数组。

上面的这种“懒惰导入”方法使用起来非常方便,但是在一些场景下不是非常的效率,比如,如果我们想访问N个POST的作者的信息,使用这种懒惰导入的方法将会执行N个join查询;

 

急切导入查询方法

下面介绍是一种“急切导入”方法:在使用find和findAll时,使用with()方法,例:

[html] view plaincopy
 
  1. $posts=Post::model()->with('author')->findAll()

这样就可以在一次查询时连同查询其他信息了;with方法可以接受多个关系:

[html] view plaincopy
 
  1. $posts=Post::model()->with('author','categories')->findAll();

这样就可以将作者和类别的信息一并进行查询;同样,with还支持多重急切导入

$posts=Post::model()->with( 'author.profile', 'author.posts', 'categories')->findAll();

上面的代码不仅会返回autho和categories信息,还会返回作者的profile和posts信息这种“急切导入”方法也支持CDbCriteria::with,下面这两种实现方式效果一样:

 

[html]view plaincopy
 
  1. $criteria=newCDbCriteria;
  2. $criteria->with=array('author.profile','author.posts','categories',);
  3. $posts=Post::model()->findAll($criteria);
  4. 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关系

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

 

[html]view plaincopy
 
  1. classPostextendsCActiveRecord
  2. {
  3. ......
  4. publicfunctionrelations()
  5. {
  6. returnarray(
  7. 'author'=>array(self::BELONGS_TO,'User','author_id'),
  8. 'categories'=>array(self::MANY_MANY,'Category',
  9. 'tbl_post_category(post_id,category_id)'),
  10. );
  11. }
  12. }
  13. classUserextendsCActiveRecord
  14. {
  15. ......
  16. publicfunctionrelations()
  17. {
  18. returnarray(
  19. 'posts'=>array(self::HAS_MANY,'Post','author_id'),
  20. 'profile'=>array(self::HAS_ONE,'Profile','owner_id'),
  21. );
  22. }
  23. }

 

此时,我们使用$author->posts时,会返回固定ORDER的POST信息

分享到:
评论

相关推荐

    yii框架中文文档、yii中文手册教程

    在“yii1.1中文文档”中,包含了Yii 1.1版本的详尽教程和参考指南。这个版本是Yii框架的一个稳定版本,尽管现在已经有了更新的2.0版本,但仍然有许多项目基于1.1版本运行。文档通常会涵盖框架的基础知识,如MVC...

    yii框架中文手册教程

    1. 基于组件的设计:Yii框架采用组件化的设计模式,这意味着整个框架由多个可复用的组件构成,每个组件可以独立使用或配合其他组件完成特定的功能。这种设计让开发者能够灵活地组合和构建复杂的Web应用。 2. 高性能...

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

    很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架

    YII框架中文手册

    **Yii框架中文手册** Yii(读作"易")是一个高性能、基于组件的PHP框架,专为开发...在实际开发中,不断查阅并理解Yii中文手册,结合实例操作,将理论知识转化为实践经验,将有助于提升开发者在Yii框架下的编程技能。

    《Yii框架深度剖析》配套代码

    本书不是简单地介绍如何使用 Yii 框架,而是站在框架设计的高度,从源代码级别深 度剖析。本书首先介绍 PHP 框架技术的概念及其应用领域,然后开始仿照 Yii 框架源代码 自定义框架,其中包括了 MVC 设计模式、单入口...

    php最新框架YII框架

    Yii的名字来源于"易",在汉语中意味着简单和快捷,这也体现了框架的设计理念。 一、Yii框架概述: 1. 高性能:Yii通过使用缓存机制、优化的查询构建器和预编译的模板引擎等技术,提供了比其他PHP框架更快的运行速度...

    Yii框架学习手册

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

    Yii框架PDF中文文档

    ### Yii框架知识点总结 #### 一、概述与新特性 ...无论是在基础概念的理解还是实际开发过程中遇到的问题,Yii框架都有详尽的文档和技术支持,使得开发者能够更加专注于业务逻辑的实现,大大提高了开发效率。

    Yii框架快速入门

    安装完成后,使用Yii的命令行工具`yiic`或`yii`(取决于你的Yii版本)来创建新的项目结构。记得配置好Web服务器,如Apache或Nginx,以便正确解析Yii的URL规则。 三、基本架构 1. Model:模型代表数据逻辑,通常是...

    yii 框架中文帮助文档

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

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

    本教程将深入探讨Yii框架的核心概念和使用方法,同时提供一份中文手册教程,以便于中文使用者更好地理解和应用。 首先,Yii框架的核心特性包括MVC(模型-视图-控制器)设计模式、Active Record ORM(对象关系映射)...

    yii框架(1.1.15)

    4. **组件升级**:Yii框架的核心组件可能会有新的功能或改进,比如ActiveRecord的增强,使得数据操作更加方便;CWidget和CAction等组件可能也进行了优化,提供更好的用户体验。 5. **文档更新**:随着框架的更新,...

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

    在中文教程中,你将学习到如何安装Yii框架,如何配置环境,如何创建项目结构,以及如何使用Yii的组件和服务。教程会详细解释每个关键概念,如路由、控制器、视图和模型的创建,以及如何利用Yii的模板引擎来美化输出...

    yii框架下的yii_blog 博客系统

    在这个"yii_blog 博客系统"中,你将学习到如何使用Yii框架来搭建一个简单的博客平台。 首先,Yii框架的核心特性包括MVC(Model-View-Controller)设计模式、主动记录(ActiveRecord)模式、缓存管理、身份验证和...

    yii示例-下拉框-最新的yii框架

    在这个“yii示例-下拉框-最新的yii框架”中,我们将探讨如何在Yii2框架中实现下拉框功能。 1. **安装Yii框架** 在开始创建下拉框之前,你需要确保已经安装了最新版本的Yii框架。这通常通过Composer完成,运行`...

    Yii框架执行流程及部分源码分析

    让我们深入了解一下Yii框架的执行流程及其部分源码分析。 1. **程序结构及配置** Yii的项目结构通常包含以下关键部分: - `protected`:存放应用的核心代码,如模型、控制器、配置文件等。 - `runtime`:运行时...

    yii框架商城

    首先,Yii框架的核心特性之一是其对象关系映射(ORM),即ActiveRecord。在这个商城项目中,ORM使得数据库操作更加便捷,可以轻松地将数据库表与PHP类关联,通过对象的方式来操作数据。例如,商品信息可以被封装在` ...

    YII框架中文手册教程

    Yii将Web编程中的可重用性发挥到极致,使得开发者能够快速构建高质量的Web应用。 - **适用场景**:Yii框架特别适合用于开发高流量的应用程序,如门户、论坛、CMS(内容管理系统)、电子商务系统等。 - **技术要求*...

Global site tag (gtag.js) - Google Analytics