Yii2中hasOne、hasMany及多对多关联查询的用法详解


Posted in PHP onFebruary 15, 2017

前言

hasOne、hasMany是Yii2特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。为什么?因为这种方式关联查询出来的结果会保留Yii2自有的表头排序功能,以及CheckboxColumn中input的id存值,至于还有没有其它的好处就需要大家去挖掘了,笔者目前就发现了这两个常用的好处。其他的关联查询,像yiidbQuery查询或者原生的SQL语句查询都没有,查询出来在列表展示的时候,表头一排黑。

Yii2的hasOne、hasMany多表关联查询,不管是文档还是文章其实都可以轻而易举的找到参考母本,但是笔者为什么还要写这篇文章呢,想法其实也很简单,因为在前面的信息中我没有看到多对多关联查询的用法,不重复别人,也重复自己,本文的重点就讲多对多关联查询的用法,让你涨涨知识。

需求分析

1、使用一条查询语句就能把列表的数据全部展现出来,列表包含一对一,一对多,以及多对多的关系。

2、不能破坏Yii2自有的表头排序功能,以及CheckboxColumn中input的id存值。

效果图

1、一对一,一对多,多对多,表头排序。

Yii2中hasOne、hasMany及多对多关联查询的用法详解

2、CheckboxColumn中input的id值。

Yii2中hasOne、hasMany及多对多关联查询的用法详解

代码分析

多对多

例子:一个客户可以有多个标签,一个标签可以对多个客户。

1、在TSales(客户表的 model)里加入如下代码:

public function getcommon_tag()
 { 
  return $this->hasMany(CommonTag::className(), ['itemid' => 't_id'])->onCondition(['idtype' => "内容"])->joinWith(['tag']);    
 }

注释:这里common_tag表为中间表,common_tag中间表用hasMany与客户表关联之后要在后面加上joinWith(['tag'])关联标签表。onCondition为附加条件的方法。

2、在CommonTag(中间表 model)里加入如下代码关联标签表,用hasOne就行。

public function gettag()
{ 
 return $this->hasOne(Tag::className(), ['id'=>'tagid']);
}

3、在TSalesSearch(客户的Search model) 里加入如下代码关联common_tag中间表: $query->joinWith(['common_tag']);

4、页面输出代码如下:

[
 'attribute' => 'tag_id',
 'value' => function ($model) { 
  $_tag=$model->getRelatedRecords()['common_tag'];
  if(!empty($_tag)){
   $tagName="";
   foreach ($_tag as $key => $value) {                        $tagName.=$value['tag']['name'].'/';
   }
   return rtrim($tagName,'/');
  } 
 },
],

注释:$model->getRelatedRecords() 是用于获取[_related:yiidbBaseActiveRecord:private]数组的值。

一对多

1、在前面的多对多用法中涉及到的hasMany就属于一对多的用法,要实现一对多的话就把后面的joinWith去掉就可以了,其它配置以及输出方式都一样。

一对一

1、一对一的用法前面也涉及了,hasOne就属于一对一的用法,配置和hasMany一样,这里就不详述了。

注意事项

1、当关联查询出来的值使用如下代码输出(common_tag.name)获取不到值的时候,那就应该是你的客户表存在这个name字段,并且这个值为空,重名了之后就会优先输出主表的字段,解决办法用:$model->getRelatedRecords()获取。

[
 'attribute' => 'tag_id',
 'value' => 'common_tag.name'
 ]

以上所述是小编给大家介绍的Yii2中hasOne、hasMany及多对多关联查询的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
Windows7下PHP开发环境安装配置图文方法
May 20 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
Nov 02 PHP
PHP仿盗链代码
Jun 03 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
Jun 06 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
Jun 24 PHP
测试php函数的方法
Nov 13 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
Laravel监听数据库访问,打印SQL的例子
Oct 24 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 #PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 #PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 #PHP
php+Memcached实现简单留言板功能示例
Feb 15 #PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 #PHP
PHP中Trait及其应用详解
Feb 14 #PHP
php数组指针操作详解
Feb 14 #PHP
You might like
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
PHP-X系列教程之内置函数的使用示例
2017/10/16 PHP
[IE&FireFox兼容]JS对select操作
2007/01/07 Javascript
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
js或css实现滚动广告的几种方案
2010/01/28 Javascript
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
Python登录注册验证功能实现
2018/06/18 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
python中如何打包用户自定义模块
2020/09/23 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
财产公证书
2014/04/10 职场文书
读群众路线的心得体会
2014/09/03 职场文书
2019年思想汇报
2019/06/20 职场文书
vscode内网访问服务器的方法
2022/06/28 Servers