[yii框架关联查询]Yii框架关联查询with用法介绍

更新时间:2019-08-16    来源:php框架模板    手机版     字体:

【www.bbyears.com--php框架模板】

Yii的关联查询确实是一个方便的东西,网上的资料也很多,但是大部分都是Ctrl+c,Ctrl+v,有些东西一直没有人出来详细的写篇文章说明一下,在参考了网上很多资源以后,加上自己的的一些理解,写下了这篇博客,给广大初学者朋友们指点一下迷津。
借鉴一点别人的东西。。。
 
YII 支持四种类型的关系:

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 不直接支持 多对多 关系,因此需要有一个关联表将 多对多 关系分割为 一对多 关系。

 
菜鸟们看到这个真的能明白吗?
初学的时候,哥表示头晕至极,经过反复的测试,我给大家非常直白的解释一下。
现有用户表user和博客表blog,博客是属于某个用户的,而用户会发表多篇博客。
BELONGS_TO:
controller
  $blogs = $blog_model->with("b_user")->find();
model 这里的model指的是blog_model
  "b_user"=>array(self::BELONGS_TO, "user", "author"),
适用范围,查找博客的时候需要把博客的作者也查出来。
b_user中第二个参数:子表的表名,第三个参数,主表中用于存子表主键的字段(blog表中用于存user表主键的字段)。
 
HAS_ONE:
controller
  $user_blog = $user_model->with("u_blog")->find();
model 这里的的model指的是user_model
 "u_blog"=>array(self::HAS_ONE, "blog", "author"),
测试一下,不仅仅查出了作者的信息,而且还查出了一篇该作者的博客。
u_blog中的第二个参数:子表表名,第三个参数,子表中用于存主表主键的字段(blog表中用于存user表主键的字段)。
 
HAS_MANY:
controller
  $user_blogs = $user_model->with("u_blogs")->find();
model 这里的的model指的是user_model
 "u_blogs"=>array(self::HAS_MANY, "blog", "author"),
测试一下,不仅仅查出了作者的信息,也不仅仅查出了一篇该作者的博客,而且还查出了该作者其它的博客。
u_blogs中的第二个参数:子表表名,第三个参数,子表中用于存主表主键的字段(blog表中用于存user表主键的字段)。
 
MANY_TO_MANY:
这个东西啊,我还没用过,貌似基本上也不会用到,待我测一下,再来续上。。。
 
至此,Yii with的最最基本用法说的差不多了,但是你就没有啥疑问吗?
如何指定要查询的子表字段?
HAS_MANY中查出了该用户的所有文章,如果我只想要查5篇呢?
……等你来提问。
那么,废话不多说,解决第一个问题
 "u_blogs"=>array(self::HAS_MANY, "blog", "author","select"=>"gid,title,content"),
这样试试?
第二个问题
 "u_blogs"=>array(self::HAS_MANY, "blog", "author","select"=>"gid,title,content","condition"=>"u_blogs.gid=2"),
 搞定!
 
相信看过这些非常小白的讲解后应该恍然大悟了吧。此所谓万事开头难啊,剩下的东西相信你一看就懂了~~~
 
以下内容来自Yii手册:
 
延迟加载时有一定的关系,下列选项可用:
"group": string, GROUP BY子句。 默认值为空。 注意,列引用需要加入"relationName"前缀 。(例如: relationName.age)。此选项仅适用于HAS_MANY 和 MANY_MANY 关系。
"having": string, HAVING子句。 默认值为空。 注意,列引用需要加入"relationName"前缀 。(例如: relationName.age)。此选项仅适用于HAS_MANY 和 MANY_MANY 关系。
"limit": 数据行的limit选择。 这个选项不能应用到BELONGS_TO。
"offset": 数据行的偏移量。 这个选项不能应用到BELONGS_TO。
"through": 获取相关的数据时将用作桥的模型的关系的名称。可以设置仅为 HAS_ONE 和 HAS_MANY。此选项自版本 1.1.7 可用。
 以下是一个例子,为 "Post" 活动记录类相关对象的一个示例:

 代码如下 return array(
    "author"=>array(self::BELONGS_TO, "User", "author_id"),
    "comments"=>array(self::HAS_MANY, "Comment", "post_id", "with"=>"author", "order"=>"create_time DESC"),
    "tags"=>array(self::MANY_MANY, "Tag", "post_tag(post_id, tag_id)", "order"=>"name"),
);

本文来源:http://www.bbyears.com/jiaocheng/62469.html