簡體   English   中英

在Yii2中使用關系聯接多個表

[英]JOIN multiple table using relations in Yii2

我試圖通過使用關系通過yii2Kartik GridView小部件列出一些數據。 我有這些桌子

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表通過designations.designation_group_iddesignation_group相關。 designations表將具有一個或多個用逗號分隔的值designation_group.id

designations表通過staffs.designation_id =designations.id與職員表相關。 Staffs Model中,我添加了這樣的關系

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,它將顯示與該組名稱關聯的人員數據

好吧,從我能夠從您的問題中提取的信息中,您希望能夠獲得每個員工的組名。 下面的代碼將幫助您完成該任務。

在人員模型中,創建如下所述的關系,或者您可以使用現有的關系,我相信Yii會自動為您生成關系

STAFF模型

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

在名稱模型內,創建另一個關系,將關聯模型與名稱組模型鏈接起來,該模型也將自動創建

型號名稱

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

最后,在您的gridview上,您可以使用以下代碼獲取組名

$model->destination->designationGroup->group_name

我希望這能解決您的問題。 雖然我已經使用過幾次。

如果我理解您的話,那似乎是幾天前的問題。 看一下這個

我有三個表(contact,contact_groups和contact_contact_groups),它們具有多對多關系。 這意味着一個聯系人有很多組,而一組有很多聯系人。 因此,我創建了一個表以建立一對多關系。

但結果將是這樣的:

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

員工模型

使用->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

希望能幫助到你。

我建議您從指定表中刪除列designation_group_id ,因為它包含多個逗號分隔的值。 再創建一個名為designation_group_assigned的表,該表將包含以下列: Iddesignation_iddesignation_group_id

在此表中,如果一個名稱屬於多個組,我們可以插入多行。

然后,您可以將yii關系用於一對多記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM