Yii框架关联查询with用法分析


Posted in PHP onDecember 02, 2014

本文实例分析了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:
这个东西啊,我还没用过,貌似基本上也不会用到,待我测一下,再来续上。。。
 
至此,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'),

);

希望本文所述对大家的yii框架程序设计有所帮助。

PHP 相关文章推荐
一棵php的类树(支持无限分类)
Oct 09 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
php懒人函数 自动添加数据
Jun 28 PHP
Ajax+PHP快速上手及简单应用说明
Jul 24 PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 PHP
跟我学Laravel之请求(Request)的生命周期
Oct 15 PHP
Laravel 5 框架入门(四)完结篇
Apr 09 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 #PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 #PHP
php页面函数设置超时限制的方法
Dec 01 #PHP
PHP实现抓取HTTPS内容
Dec 01 #PHP
php设置静态内容缓存时间的方法
Dec 01 #PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 #PHP
PHP清除字符串中所有无用标签的方法
Dec 01 #PHP
You might like
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
vue中监听返回键问题
2019/08/28 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
C++是不是类型安全的
2014/02/18 面试题
史上最全面的Java面试题汇总!
2015/02/03 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
网络程序员自荐信
2014/01/25 职场文书
关于建议书的格式范文
2014/05/20 职场文书
大学迎新生标语
2014/10/06 职场文书
2015年宣传工作总结
2015/04/08 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers