资讯专栏INFORMATION COLUMN

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

BDEEFE / 1215人阅读

摘要:前言是特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。需求分析使用一条查询语句就能把列表的数据全部展现出来,列表包含一对一,一对多,以及多对多的关系。不能破坏自有的表头排序功能,以及中的存值。相关资料中多表关联查询

前言

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

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

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

注意事项

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

 [
    "attribute" => "tag_id",
    "value" => "common_tag.name"
 ]  
相关资料

Yii2中多表关联查询

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66353.html

相关文章

  • Yii2hasOnehasMany以及对多关联查询用法

    摘要:前言是特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。需求分析使用一条查询语句就能把列表的数据全部展现出来,列表包含一对一,一对多,以及多对多的关系。不能破坏自有的表头排序功能,以及中的存值。相关资料中多表关联查询 前言 hasOne、hasMany是Yii2特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。为什么?因为这种方式关联查询出来...

    qc1iu 评论0 收藏0
  • Yii2hasOnehasMany以及对多关联查询用法

    摘要:前言是特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。需求分析使用一条查询语句就能把列表的数据全部展现出来,列表包含一对一,一对多,以及多对多的关系。不能破坏自有的表头排序功能,以及中的存值。相关资料中多表关联查询 前言 hasOne、hasMany是Yii2特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。为什么?因为这种方式关联查询出来...

    lmxdawn 评论0 收藏0
  • YII2多表关联使用

    摘要:第二个参数是一个数组,其中键为所关联的模型中的属性,值为当前模型中的属性。这里注意中的第二个是指关联的中的,第一个是指中的。 首先先来说明一下表结构 表结构 现在有订单表、用户表、商品清单表、商品库存表 showImg(https://segmentfault.com/img/bVRcME?w=833&h=244); showImg(https://segmentfault.com/i...

    vslam 评论0 收藏0
  • Yii修行之路 - Active Record 活动记录

    摘要:建立关联关系后,通过可以获取一个对象的数组,该数组代表当前客户对象的订单集。定义关联关系使用一个可以返回对象的方法,对象有关联上下文的相关信息,因此可以只查询关联数据。基于表外键定义关联关系是最佳方法。 简介 Yii 在操作数据库方面提供了一个十分强大的类库来支撑整个框架业务的运转,这就是 Active Record (活动记录,以下简称AR)。 基本概念 AR类提供了一个面向对象的接...

    HmyBmny 评论0 收藏0

发表评论

0条评论

BDEEFE

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<