我试图通过使用关系在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,它将显示与该组名称相关联的人员数据
答案 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的表,其中包含以下列:Id
,designation_id
,designation_group_id
在此表中,如果一个名称属于多个组,我们可以插入多个行。
然后您可以将yii关系用于一对多记录。