2015-08-22 6 views
5

Ho due tabelle staff con colonne id, name e attendance. staff_id viene utilizzato come chiave esterna nella tabella attendance.Come ottenere il valore della chiave esterna invece della chiave nella visualizzazione della griglia con la ricerca e il filtraggio in yii 2?

Desidero visualizzare il nome del personale nella griglia di presenza.

presenze modello:

public function getStaff() 
{ 
     return $this->hasOne(Staff::className(), ['id' => 'staff_id']); 
} 

public function getStaffName() { 
      return $this->staff->name; 
} 

e index.php ho usato questo codice

 <?= GridView::widget([ 
      [ 
      'attribute'=>'staff_id', 
      'value'=>'StaffName', 
      ], 
]); ?> 

per ottenere il valore del nome personale. In questo modo sto ottenendo il nome dello staff con successo, ma il problema è che quando faccio la ricerca del nome dello staff in gridview dice "staff_id" dovrebbe essere intero come lo definisco come intero, ma qui voglio cercare il nome dello staff invece di id .

Com'è possibile? Grazie in anticipo

+0

se è stata definita una relazione tra di loro, è sufficiente indicare il nome della relazione anziché il nome della colonna – tinybyte

risposta

4

Aggiungi questo alla ricerca modello

$query->joinWith(['staff(relation name)']);

e aggiungere sotto il codice a query di filtro.

$query->andFilterWhere(['like', 'staff.name', $this->staff_id])

In staff.name che nel staff è il nome della tabella.

+0

Grazie. Questo codice funziona. – raxa

+0

Come posso farlo se la tabella A non ha una chiave esterna con la tabella B? perché la mia tabella utilizza il motore MyISAM. Ma la tabella A ha in realtà una colonna che contiene l'id della tabella B. Grazie – Blackjack

+0

@Blackjack devi semplicemente creare una funzione nel tuo modello con l'uso di '$ this-> hasOne()' OR '$ this-> hasMany()' . come 'funzione pubblica getStaff() { return $ this-> hasOne (Staff :: className(), ['id' => 'staff_id']); } ' – GAMITG

5

È possibile utilizzare questo codice

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'columns' => [ 
     'staff.name', 
    ], 
]); ?> 

O utilizzare questo codice

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'columns' => [ 
     [ 
      'attribute' => 'staff.name', 
      'header' => 'Staff title' 
      'value'=> 'function ($model, $key, $index, $grid){ 
       return $model->staff->name; 
      }' 
     ], 
    ], 
]); ?> 

O nel codice è possibile utilizzare questo

<?= GridView::widget([ 
    [ 
     'attribute'=>'staff_id', 
     'value'=>'getStaffName()', 
    ], 
]); ?> 

e per la ricerca è possibile guardare questo video Searching Related Table Data

+0

Il problema risolto di Thank. Per la ricerca sopra il video è stato molto bello. – raxa

+0

il benvenuto ;-) –

0
You can use this code 

1. relation in models 
public function getCountry() 
    { 
     return $this->hasOne(Country::className(), ['id' => 'country_id']); 
    } 
2. in grid view 
<?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 

      'id', 
      'state_name', 
      // 'country_id', 
     [ 
     'attribute'=>'country_id', 
     'value'=>'country.country_name', 
    ], 
      ['class' => 'yii\grid\ActionColumn'], 
     ], 
    ]); ?> 
3. Search Models 
    change country_id from integer to safe than change on search function 

public function search($params) 
    { 
     $query = State::find(); 
     $query->joinWith(['country']); 
     $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
     ]); 
     $this->load($params); 
     if (!$this->validate()) { 
      return $dataProvider; 
     } 
     $query->andFilterWhere([ 
      'id' => $this->id, 
     ]); 
     $query->andFilterWhere(['like', 'state_name', $this->state_name]) 
     ->andFilterWhere(['like', 'country.country_name', $this->country_id]); 
return $dataProvider; 
    }