Yii框架关联查询with用法分析
本文实例分析了Yii框架关联查询with用法。分享给大家供大家参考。具体方法如下:
Yii框架关联查询与mysql中的关联查询会有什么区别呢?这里小编就与各位来一起来看看吧。
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:
这个东西啊,我还没用过,貌似基本上也不会用到,待我测一下,再来续上。。。
至此,Yiiwith的最最基本用法说的差不多了,但是你就没有啥疑问吗?
如何指定要查询的子表字段?
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,GROUPBY子句。默认值为空。注意,列引用需要加入'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'活动记录类相关对象的一个示例:
returnarray( 'author'=>array(self::BELONGS_TO,'User','author_id'), 'comments'=>array(self::HAS_MANY,'Comment','post_id','with'=>'author','order'=>'create_timeDESC'), 'tags'=>array(self::MANY_MANY,'Tag','post_tag(post_id,tag_id)','order'=>'name'), );
希望本文所述对大家的yii框架程序设计有所帮助。