Yii2 relation kullanımı

Veri tabanında ki tablolar arası ilişkileri gii üzerinden oluşturduğumuz crud yapısı otomatik olarak model dosyalarına tanımlayacaktır. User tablosuyla ilişkisi olan herhangi bir tablonun listelemesinde relation kullanımı aşağıdaki gibi olacaktır.

model dosyası içerisindeki ilişki tanımı aşağıdaki gibidir. getUser bize ilişkiyi kullanacağımız adı vermektedir.

public function getUser()
{
return $this->hasOne(User::className(), [‘id’ => ‘userid’]);
}

Gridview içeresinde userid alanından kullanıcının adının yada user tablosundaki herhangi bir alanın çağırılması  için aşağıdaki gibi kullanımı olacaktır.

[
‘attribute’=>’userid’,
‘format’=>’raw’,
‘value’=>’user.username’,
],

gridview içinde

‘user.username’

yerine

[
‘attribute’=>’userid’,
‘format’=>’raw’,
‘value’=>’user.username’,
],

kullanımı sayesinde gridview içerisindeki filtreleme özelliği aktif edilebilir.

gridviewsearch

Fakat bu filtrelemede integer olan değerin yani ilişkili tablodaki primary key değerinin girilmesi gerekir.

gridviewsearchhata

Bunun için model içindeki search dosyasındaki rules fonksiyonunda alan integer tanımından kaldırılıp safe kısmına eklenir.

Aynı dosyada aşağıdaki şekilde relationın adı tanımlanır.

$query->joinWith(‘user’);

Aynı dosyada daha alt satırlardaki andFilterWhere deki ilgili alanın satırı silinip aşağıdaki şekilde eklenir.

->andFilterWhere([‘like’, ‘user.username’, $this->userid]);

Dosyanın olması gereken hali aşağıdaki gibi olacaktır.

$query->andFilterWhere([
‘id’ => $this->id,
// ‘userid’ => $this->userid,
‘randevu_birimi’ => $this->randevu_birimi,
‘randevu_saati’ => $this->randevu_saati,
‘randevu_tarihi’ => $this->randevu_tarihi,
‘islem_zamani’ => $this->islem_zamani,
]);

$query->andFilterWhere([‘like’, ‘randevu_onayi’, $this->randevu_onayi])
->andFilterWhere([‘like’, ‘user.username’, $this->userid]);

gridviewsearcharama

 

bunun sonucunda id ile değil username e göre arama yapabilir duruma gelinecektir.

gridviewsearcharamasonuc