Yii2: Searching Related Data from Same Table in Griedview

Saya bingung memberi judul apa, namun mudah2an ini bermanfaat bagi saya pribadi :), bukan buat kamu, ya kamu..

Jadi saya punya sebuah tabel sebagai berikut,
tb_group
——–
id INT
parent_id INT
name VARCHAR(255)

Lalu saya generate CRUD, maka jadilah tampilan Gridview berikut:
1

 

 

 

Disini saya ingin menambahkan fungsi search pada kolom parent_id, dimana parent_id merujuk pada field id tabel tb_group juga.. nah.. ini case study kita.

1) Tambahkan fungsi relaasi ke dirinya sendiri pada model Group,

class Group extends \yii\db\ActiveRecord
{
	...

	public function getParentGroup()
    {
        return $this->hasOne(Group::className(), ['id' => 'parent_id']);
    }

2) Dengan fungsi relasi tersebut, kita bisa memodifikasi kolom parent_id di Gridview

 	<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
        	....,
 			[
				'attribute' => 'parent_id',
				'format'=>'raw',
				'value' => function ($data){
					$group = $data->parentGroup;
					if(!empty($group)){
						return 	$group->name;
					}
					else{
						return "-";
					}
				}
			],
			....,

2

 

 

 

 

Namun ketika dilakukan pencarian pada kolom parent_id maka hasilnya

3

 

 

 

 

 

3) Memperbaiki error saat pencarian yaitu dengan mengedit fungsi rules pada model GroupSearch

sebelumnya

	public function rules()
    {
        return [
            [['id', 'parent_id'], 'integer'],
            [['name'], 'safe'],
        ];
    }

yaitu dengan memindahkan parent_id menjadi safe

	public function rules()
    {
        return [
            [['id'], 'integer'],
            [['name','parent_id'], 'safe'],
        ];
    }

4. Memfungsikan fungsi search related data.. dengan mengedit fungsi search pada model GroupSearch

	public function search($params)
    {
        $query = Group::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        if (!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }

        // EDIT DISINI
        $dataProvider->query->joinWith([
            'parentGroup'=> function ($q){
                $q->from('tb_group tb_group2');  // join with tabel alias
            }
        ]);

        $query->andFilterWhere(['like', 'tb_group.name', $this->name]);
        $query->andFilterWhere(['like', 'tb_group2.name', $this->parent_id]);
        // SELESAI EDIT DISINI

        return $dataProvider;
    }

5. Selesai

Agak ribet sih terutama di poin ke 4,

$dataProvider->query->joinWith([
    'parentGroup'=> function ($q){
        $q->from('tb_group tb_group2');  // join with tabel alias
    }
]);

Mudah2an yii mempermudah model aliasnya untuk related data.

Sekian..

Leave a Reply

Your email address will not be published. Required fields are marked *