yii多表联查.doc_第1页
yii多表联查.doc_第2页
yii多表联查.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Yii框架中ActiveRecord使用Relations (2010-12-17 17:46:58) 前提条件在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作; 场景下面的一个ER图显示的是一个例子ER图申明关系两张表之间的关系无非三种:一对多;一对一;多对多; 在AR中,定义了四种关系:关系定义例子BELONGS_TOA和B的关系是一对多,那么B属于APost属于UserHAS_MANYA和B之间的关系是一对多,那么A有多个BUser有多个PostHAS_ONE这是HAS_MANY的一种特殊情况,A至多有一个BUser至多有一个ProfileMANY_MANY这个对应多对多的情况,在AR里会将多对多以BELONGS_TO和HAS_MANY的组合来解释Post和Category在AR中通过重写CActiveRecord类的relations()方法来申明关系;这个方法返回一个关系配置的数组;一个数组无素代表一个单独的关系,格式如下:VarName=array(RelationType,ClassName,ForeignKey, .additional options)Var Name关系名Relation Type四种关系:self:BELONGS_TO, self:HAS_ONE, self:HAS_MANY, self:MANY_MANYClass Name代表当前AR类要关联的那个AR类名Foreign Key实现关系的外键,有可能有多个,即列名下面的代码表示用来定义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( file, author.posts, categories)-findAll();上面的代码不仅会返回autho和categories信息,还会返回作者的profile和posts信息这种“急切导入”方法也支持CDbCriteria:with,下面这两种实现方式效果一样:$criteria=new CDbCriteria; $criteria-with=array( file, author.posts, categories, ); $posts=Post:model()-findAll($criteria); or $posts=Post:model()-findAll(array( with=array( file, author.posts, categories, ) );关系查询选项前面提过,在申明关系时可以添加额外的选项,这些选项都是一些key-value对,是用来定制关系查询的,总结如下:select定义从AR类中被select的列集合,如果定义为*,则表示查询所有列condition定义where语句,默认为空。params生成SQL语句的参数,这个需要用一个key-value对的数组来表示;onON语句,这个条件用来通过AND添加一个joining condintion语句orderORDER语句with和当前对象一起导出的相关对象列表,要注意如果使用不正确,有可能导致无限死循环;joinType定义join的类别,默认为LEFT OUTER JOINalias定义别名,当多个表中有相同的column name时,需要为表格定义alias,然后使用tablename.columnname来指定不同的columntogether这个只在HAS_MANY, MANY_MANY时有用,在实现跨表查询时,可以用这个参数来控制性能。正常用不到,不详细讲述;joinJOIN语句groupGROUP语句havingHAVING语句index这个值用来设定返回的结果数组以哪个column做为index值,如果不设定这个值的话,将从0开始组织结果数组。除此之外还包含下面几个选项,在“懒惰导出”的特定关系时可用limit返回结果数量的限制,不适用于BELONG_TO关系offsetoffset结果数量的值,不适用于BELONG_TO关系下面代码,显示上面选项的一些使用:class User extends CActiveRecord public function relations() return array( posts=array(self:HAS_MANY, Post, au

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论