2016-02-25 10 views
8

Ich versuche, einige Daten über Kartik GridView Widget in yii2 mithilfe von Beziehungen aufzulisten. Ich habe diese TabellenJOIN multiple Tabelle mit Beziehungen in 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 Tabelle designation_group von designations.designation_group_id verwandt ist. designations Tabelle wird einen oder mehrere durch Komma getrennte Werte haben, von designation_group.id.

designations Tabelle bezieht sich auf Stäbe Tabelle von staffs.designation_id =designations.id. In Staffs Modell Ich habe Beziehungen wie diese hinzugefügt

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

und arbeitet perfekt. Aber das Verhältnis für designation_group versuchte ich wie folgt aus:

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

Aber es funktioniert nicht das erwartete Ergebnis. Wie kann die Tabelle designation_group verbunden werden, so dass auch alle mit den Mitarbeitern verbundenen Bezeichnergruppen angezeigt werden können? Ich möchte zeigen, wie, die erste Spalte der Rasteransicht wird Bezeichnungen sein, während der Filter der gleichen Spalte DesignationGroup.group_name sein sollte. SO wenn irgendein group_name ausgewählt wird, zeigt es Daten von Mitarbeitern an, die mit diesem Gruppenname verbunden sind

+0

Verwendung yii2 joinWidth wie ... 'Modell :: find() -> joinWith ([ 'Relation Name']) -> alle();' beziehen dieser Link [Join With Relation] (http://www.yiiframework.com/doc-2.0/guide-db-active-record.html) – vishuB

+0

Die Beziehung nicht Desgroupstaffs gibt die Bezeichnung Gruppe – user7282

+0

diese eine Beziehung ist falsch '[ 'id' => 'id'] 'in' getDesgroupstaffs() 'Funktion – vishuB

Antwort

-1

Ich empfehle Ihnen, die Spalte designation_group_id aus der Bezeichnungstabelle zu entfernen, da sie vielfache kommagetrennte Werte enthält. Erstellen Sie eine weitere Tabelle mit dem Namen designation_group_assigned, die die folgenden Spalten haben: Id, designation_id, designation_group_id

In dieser Tabelle können wir mehrere Zeilen einfügen, wenn eine Bezeichnung zu mehreren Gruppen gehört.

Und dann können Sie die yii-Beziehungen für einen bis viele Datensätze verwenden.

2

Nun, von dem, was ich in der Lage war, aus Ihrer Frage zu extrahieren, möchten Sie in der Lage sein, den Gruppennamen für jeden der Mitarbeiter zu bekommen. Der folgende Code hilft Ihnen dabei, diese Aufgabe zu erfüllen.

Innerhalb des Personalmodell, erstellen Sie eine Beziehung wie unten angegeben, oder Sie können eine vorhandene verwenden, die ich bin sicher, dass Yii automatisch generiert haben würde für Sie

STAFF Modell

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

Innen das Bezeichnungsmodell, erstellen Sie eine weitere Relation, die das Deginationsmodell mit der BezeichnungGruppenmodell verknüpft, das automatisch ebenfalls erstellt wurde

Bezeichnung Modell

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

schließlich auf Ihrem gridview, können Sie den Code unten verwenden, um die Gruppennamen

$model->destination->designationGroup->group_name 

Ich hoffe, das löst Ihr Problem zu bekommen. Obwohl ich es einige Male benutzt habe.

+1

Der Filter in der Rasteransicht zeigt keine korrekten Daten an. designation_group_id ist eine Menge kommagetrennter Werte. Die erste Spalte der Rasteransicht ist eine Bezeichnung, während der Filter derselben Spalte DesignationGroup.Gruppenname sein sollte – user7282

0

Wenn ich Sie verstehe, sieht es aus wie mein Problem vor ein paar Tagen. check this out

Ich habe drei Tabellen (Kontakt, contact_groups und contact_contact_groups), die viele-zu-viele Beziehung hat. Es bedeutet, dass ein Kontakt viele Gruppen hat und eine Gruppe viele Kontakte hat. Also erstelle ich eine Tabelle, um die Eins-zu-Viele-Beziehungen herzustellen.

aber das Ergebnis wird wie folgt aus:

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