8

我正在尝试使用关系通过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_groupby相关designations.designation_group_iddesignationstable 将具有一个或多个以逗号分隔的值 of 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

4 回答 4

2

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

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

员工模型

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

在 designation 模型中,创建另一个将 degination 模型与 designationGroup 模型链接的关系,该模型也将自动创建

名称 型号

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

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

$model->destination->designationGroup->group_name

我希望这能解决你的问题。虽然我用过几次。

于 2016-02-26T11:45:33.143 回答
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]);
}

On GridView,将值呈现为

$model->destination->designationgroup->group_name

希望能帮助到你。

于 2018-03-23T11:32:17.650 回答
0

如果我理解你,这看起来像我几天前的问题。看一下这个

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

但结果会是这样的:

contact | contact groups
-------------------------
contact #1 | business1, business2, family
contact #2 | family
contact #3 | student, partner
于 2016-03-02T03:07:01.057 回答
-1

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

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

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

于 2016-02-25T08:06:32.893 回答