2015-08-22 26 views
5

Mam dwie tabele staff z kolumnami id, name i attendance. staff_id jest używany jako klucz obcy w tabeli attendance.Jak uzyskać klucz obcy zamiast klucza w widoku siatki przy wyszukiwaniu i filtrowaniu w yii 2?

Chcę wyświetlić nazwę personelu w widoku siatki obecności.

Frekwencja model:

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

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

aw index.php Kiedyś ten kod

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

uzyskać wartość nazwy personelu. W ten sposób uzyskuję nazwę personelu z powodzeniem, ale problem polega na tym, że kiedy szukam nazwy personelu w gridview, to "staff_id" powinno być liczbą całkowitą, ponieważ definiuję ją jako liczbę całkowitą, ale tutaj chcę wyszukać nazwę personelu zamiast id .

Jak to jest możliwe? Dzięki z góry

+0

jeśli zdefiniowałeś relację między nimi, po prostu wpisz nazwę relacji zamiast nazwy kolumny – tinybyte

Odpowiedz

4

Dodaj ten w wyszukiwarce modelu

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

I dodać poniżej kodu w zapytaniu filtra.

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

W staff.name że w staff jest nazwa tabeli.

+0

Za dużo, ten kod działa. – raxa

+0

Jak mogę to zrobić, jeśli tabela A nie ma klucza obcego z tabelą B? ponieważ mój stół korzysta z silnika MyISAM. Ale tabela A rzeczywiście ma kolumnę, która zawiera id tabeli B. Dzięki – Blackjack

+0

@ Blacklack musisz po prostu zrobić funkcję w swoim modelu za pomocą '$ this-> hasOne()' LUB '$ this-> hasMany()' . jak jako 'funkcja publiczna getStaff() { return $ this-> hasOne (Staff :: className(), ['id' => 'staff_id']); } ' – GAMITG

5

Można użyć tego kodu

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

LUB użyć tego kodu

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

OR w kodzie można użyć tej

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

i poszukiwaniu można obejrzeć ten film Searching Related Table Data

+0

Dziękuję, że problem został rozwiązany, ponieważ wyszukiwanie powyżej wideo było całkiem przyjemne. – raxa

+0

Twoje powitanie ;-) –

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; 
    }