Yii 2 - Filter data relasi pada GridView

alfa6661
- February 16, 2016
0 (0 votes)
Rate :
Cara filter data yang berelasi pada GridView Yii 2

Pada artikel sebelumnya telah dibahas bagaimana menampilkan data yang berelasi pada GridView dan kita telah berhasil menampilkan data relasi pada GridView. Akan tetapi, jika kita coba untuk memfilter provinsi dengan mengetikkan nama provinsi akan gagal "Id Provinsi must be an integer".

Pada artikel ini kita akan membahas bagaimana membuat filter data relasi pada Gridview. Agar bisa memfilter data relasi kita harus modifikasi kode di model dan di viewnya. Kita akan menggunakan data kota dan provinsi pada artikel sebelumnya.

Model KotaSearch

Pertama kita perlu mendefinisikan attribute baru pada KotaSearch untuk menghandle nama provinsi.

public $namaProvinsi;

Kemudian tambahkan attribute diatas pada rules safe.

public function rules()
{
    return [
        // ....
        [['namaProvinsi'], 'safe'],
    ];
}

Selanjutnya pada method search, kita akan menambahkan beberapa baris kode agar filter ini bisa bekerja.

Join

Kita perlu melakukan join table ke table provinsi dengan menggunakan method joinWith.

$query = Kota::find()->joinWith(['provinsi']);

Sorting

Agar kolom ini bisa di sorting pada GridView, kita harus menambahkan kode berikut

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);
$dataProvider->sort->attributes['namaProvinsi'] = [
    'asc' => ['provinsi.nama' => SORT_ASC],
    'desc' => ['provinsi.nama' => SORT_DESC],
];

Filter

Langkah terakhir kita menambahkan kondisi filter untuk nama provinsi

$query->andFilterWhere(['like', 'provinsi.nama', $this->namaProvinsi]);

Kode Lengkap

<?php
namespace app\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\Kota;
/**
 * KotaSearch represents the model behind the search form about `app\models\Kota`.
 */
class KotaSearch extends Kota
{
    public $namaProvinsi;
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id', 'id_provinsi'], 'integer'],
            [['nama', 'namaProvinsi'], 'safe'],
        ];
    }
    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        return Model::scenarios();
    }
    /**
     * Creates data provider instance with search query applied     
     * @param array $params     
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = Kota::find()
            ->joinWith(['provinsi']);
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
        $dataProvider->sort->attributes['namaProvinsi'] = [
            'asc' => ['provinsi.nama' => SORT_ASC],
            'desc' => ['provinsi.nama' => SORT_DESC],
        ];
        $this->load($params);
        if (!$this->validate()) {
            return $dataProvider;
        }
        $query->andFilterWhere([
            'id' => $this->id,
            'id_provinsi' => $this->id_provinsi,
        ]);
        $query->andFilterWhere(['like', 'nama', $this->nama])
              ->andFilterWhere(['like', 'provinsi.nama', $this->namaProvinsi]);
        return $dataProvider;
    }
}

View

Pada view, kita akan menggunakan variable $namaProvinsi sebagai attribute yang akan digunakan untuk menghandle nama provinsi.

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        'id',
        'nama',
        [
            'attribute' => 'namaProvinsi',
            'value' => function($data) {
                return $data->provinsi->nama;
            }
        ],
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

Hasil

Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter

– Eric S. Raymond

Have a better explanation?

If you have comments about this post. Please write your comments below

No comments associated with this article