[英]JOIN multiple table using relations in Yii2
我試圖通過使用關系通過yii2
的Kartik 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_id
與designation_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的表,該表將包含以下列: Id
, designation_id
, designation_group_id
在此表中,如果一個名稱屬於多個組,我們可以插入多行。
然后,您可以將yii關系用於一對多記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.