2016-02-25 12 views
8

Sto cercando di elencare alcuni dati tramite il widget Kartik GridView in yii2 utilizzando le relazioni. Ho queste tabelleISCRIVITI a più tabelle utilizzando le relazioni 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 tavolo è legato alla designation_group da designations.designation_group_id. La tabella designations avrà uno o più valori separati da una virgola, di designation_group.id.

designations tabella è correlata alla tabella di personale da staffs.designation_id =designations.id. In Staffs Modello Ho aggiunto i rapporti come questo

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

e sta lavorando perfetto. Ma la relazione per designation_group ho provato in questo modo:

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

ma doesnt dare il risultato previsto. Come si può unire la tabella designation_group in modo che sia possibile visualizzare anche tutti i gruppi di design associati allo staff? Voglio mostrare come, la prima colonna della visualizzazione griglia sarà denominazioni, mentre il filtro della stessa colonna dovrebbe essere DesignationGroup.group_name. Se è selezionato qualsiasi nome_gruppo, mostrerà i dati del personale associato a quel nome di gruppo

+0

uso yii2 joinWidth come ... 'Modello :: find() -> joinWith ([ 'Relation Nome']) -> tutti();' riferiscono questo collegamento [Join With Relation] (http://www.yiiframework.com/doc-2.0/guide-db-active-record.html) – vishuB

+0

La relazione non desgroupstaffs dà il gruppo di designazione – user7282

+0

questa relazione è sbagliata '[ 'id' => 'id'] 'nella funzione' getDesgroupstaffs() ' – vishuB

risposta

-1

Ti suggerirò di rimuovere la colonna designation_group_id dalla tabella di designazione, perché contiene più valori separati da virgola. Creare una tabella altri il nome designation_group_assigned, che avrà le seguenti colonne: Id, designation_id, designation_group_id

In questa tabella, possiamo inserire più righe se uno designazione appartiene a più gruppi.

E quindi è possibile utilizzare le relazioni yii per uno o più record.

2

Bene, da quello che sono stato in grado di estrarre dalla tua domanda, vuoi essere in grado di ottenere il nome del gruppo per ciascuno dei membri dello staff. Il codice qui sotto ti aiuterà a portare a termine questo compito.

all'interno del modello personale, creare un rapporto, come indicato qui sotto oppure potete utilizzare uno esistente, ma sono certo Yii avrebbe generato automaticamente per voi

modello PERSONALE

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

Dentro il modello di designazione, crea un'altra relazione che collega il modello di deginazione al modello designationGroup, che sarebbe stato creato automaticamente anche

Modello

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

Infine, sul GridView, è possibile utilizzare il codice sottostante per ottenere il nome del gruppo

$model->destination->designationGroup->group_name 

Spero che questo risolve il problema. Anche se l'ho usato un paio di volte.

+1

Il filtro nella vista griglia non mostra dati corretti. designation_group_id sono un insieme di valori separati da virgola. la prima colonna della vista griglia sarà denominazioni, mentre il filtro della stessa colonna dovrebbe essere DesignationGroup.group_name – user7282

0

Se ti capisco, sembra il mio problema qualche giorno fa. check this out

Ho tre tabelle (contact, contact_groups e contact_contact_groups) con relazione molti-a-molti. Significa che un contatto ha molti gruppi e un gruppo ha molti contatti. Quindi creo un tavolo per creare relazioni uno-a-molti.

ma il risultato sarà simile a questo:

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