使用Yii2中的关系连接多个表

时间:2016-02-25 06:26:57

标签: php yii2 yii2-model

我试图通过使用关系在Kartik GridView中通过yii2小部件列出一些数据。 我有这些表

staffs

CREATE TABLE IF NOT EXISTS `staffs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `department_id` int(11) DEFAULT NULL,
  `designation_id` int(11) DEFAULT NULL,
  `username` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `emailid` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `staffrights` tinyint(2) DEFAULT '0',
  `staffstatus` tinyint(2) DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
designations

CREATE TABLE IF NOT EXISTS `designations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `designname` varchar(150) NOT NULL,
  `designation_group_id` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;



designation_group 


CREATE TABLE IF NOT EXISTS `designation_group` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_name` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

designations表与designation_group designations.designation_group_id相关联。 designations表将包含一个或多个以逗号分隔的值designation_group.id

designations表与staffs.designation_id =designations.id的员工表相关。 在Staffs模型中,我添加了这样的关系

public function getDesignations() {
        return $this->hasOne( Designations::className(), ['id' => 'designation_id']);
    }

并且工作正常。但designation_group的关系我试过这样:

public function getDesgroupstaffs(){
        return $this->hasOne(Designations::className() , ['id' => 'id'])
                    ->from(Designationgroup::tableName() ) ;
}

但它没有给出预期的结果。 如何加入designation_group表,以便还可以显示与员工关联的所有指定组? 我想表示,网格视图的第一列将是名称,而同一列的过滤器应该是DesignationGroup.group_name。因此,如果选择了任何group_name,它将显示与该组名称相关联的人员数据

4 个答案:

答案 0 :(得分:2)

嗯,从我能够从您的问题中提取的内容,您希望能够获得每个员工的组名。下面的代码将帮助您完成该任务。

在员工模型中,创建如下所述的关系,或者您可以使用现有的关系,我相信Yii会为您自动生成它

员工模式

public function getDesignation()
{
   return $this->hasOne(Designation::className(),['designation_id'=>'id]);
}

在指定模型中,创建另一个将degination模型与designationGroup模型相关联的关系,该模型也会自动创建

指定MOdel

public function getDesignationGroup()
{
   return $this->hasOne(DesignationGroup::className(),['id'=>'designation_group_id]);
}

最后,在gridview上,您可以使用以下代码获取组名

$model->destination->designationGroup->group_name

我希望这能解决你的问题。虽然我已经习惯了几次。

答案 1 :(得分:0)

如果我了解你,那几天前它就像我的问题。 check this out

我有三个表(contact,contact_groups和contact_contact_groups),它们具有多对多关系。这意味着一个联系人有很多组,一个组有很多联系人。所以我创建了一个表来建立一对多的关系。

但结果会是这样的:

contact | contact groups
-------------------------
contact #1 | business1, business2, family
contact #2 | family
contact #3 | student, partner

答案 2 :(得分:0)

员工模式

  

使用->with(['designationgroup'])

public function getDesignation()
{
   return $this->hasOne(Designation::className(),['designation_id'=>'id])->with(['designationgroup']);
}

指定模型

public function getDesignationgroup()
{
   return $this->hasOne(DesignationGroup::className(),['id'=>'designation_group_id]);
}

GridView上,将值渲染为

$model->destination->designationgroup->group_name

希望它有所帮助。

答案 3 :(得分:-1)

我建议您从指定表中删除列designation_group_id,因为它包含多个逗号分隔值。再创建一个名为designation_group_assigned的表,其中包含以下列:Iddesignation_iddesignation_group_id

在此表中,如果一个名称属于多个组,我们可以插入多个行。

然后您可以将yii关系用于一对多记录。