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 相关文章推荐
中篇:安装及配置PHP
Dec 13 PHP
PHP SQLite类
May 07 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
Feb 14 PHP
ThinkPHP模板自定义标签使用方法
Jun 26 PHP
PHP连接SQLServer2005的方法
Jan 27 PHP
PHP-FPM之Chroot执行环境详解
Aug 03 PHP
php编译安装php-amq扩展简明教程
Jun 25 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
PHP使用OB缓存实现静态化功能示例
Mar 23 PHP
tp5框架的增删改查操作示例
Oct 31 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
php 获取本地IP代码
2013/06/23 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php通过baihui网API实现读取word文档并展示
2015/06/22 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
php的debug相关函数用法示例
2016/07/11 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
动态修改DOM 里面的 id 属性的弊端分析
2008/09/03 Javascript
JS实现self的resend
2010/07/22 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
Python中的闭包详细介绍和实例
2014/11/21 Python
python微信公众号之关键词自动回复
2018/06/15 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
python求最大值最小值方法总结
2019/06/25 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
安全责任书模板
2014/07/22 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
村安全生产责任书
2014/08/25 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
大学推普周活动总结
2015/05/07 职场文书
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
关于Python中进度条的六个实用技巧分享
2022/04/05 Python