首页 > 开发 > PHP > 正文

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

2024-05-04 22:49:20
字体:
来源:转载
供稿:网友

前言

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

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

需求分析

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

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

效果图

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

2、CheckboxColumn中input的id值。

代码分析

多对多

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

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]数组的值。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表