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

use*_*282 8 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;
Run Code Online (Sandbox Code Playgroud)

designations表相关 designation_groupdesignations.designation_group_id.designationstable将有一个或多个以逗号分隔的值designation_group.id.

designations 表与员工表相关staffs.designation_id =designations.id.在StaffsModel I中添加了这样的关系

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

并且工作正常.但designation_group我的关系尝试如下:

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

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

小智 -1

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

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

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