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

时间:2021-10-03 01:10:26

前言

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)里加入如下代码:

?
1
2
3
4
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就行。

?
1
2
3
4
public function gettag()
{
 return $this->hasone(tag::classname(), ['id'=>'tagid']);
}

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

4、页面输出代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
[
 '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()获取。

?
1
2
3
4
[
'attribute' => 'tag_id',
'value' => 'common_tag.name'
]

以上所述是小编给大家介绍的yii2中hasone、hasmany及多对多关联查询的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://segmentfault.com/a/1190000007767928