Search code examples
gridviewyii2yii2-basic-app

Show multiple values for a field in gridview


i am new in yii2. I have a languages master table (in name field contains html,css, java,php...) and a registration table in which there is a field called language_id. I have inserted multiple values for that field using json_encode. Now in database showing language id's as ["1","2","3","4","5"]

Now i want to display the data stored in db using a gridview. How can i show the multiple values for languages in gridview. Given below is what i have tried with my gridview

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'first_name',
            'last_name',
            'gender',
            'address',
            ['label'=>'Course',
            'value'=>'course.name'],
            'email:email',
            ['label'=>'Languages Known',
            'value'=>'languages.name'],
            'course_completion_date',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>

and in my Model code is as follows

public function getLanguages(){

        $result = json_decode($this->language_id, true);

        return $this->hasOne(Languages::className(), ['id' => $result]);
    }

Solution

  • Finally I got answer. but I do not think this is the proper solution for this problem. Pagination is not working (when i enter into 2 page and so on) and showing error as :

    Invalid argument supplied for foreach()

    <?= GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
            'columns' => [
                ['class' => 'yii\grid\SerialColumn'],
                'first_name',
                'last_name',
                'gender',
                'address',
                ['label'=>'Course',
                'value'=>'course.name'],
                'email:email',
                ['label'=>'Languages Known',
                'value' => function ($data) 
                {
                     $arr= json_decode($data->language_id,true);
                     $lang="";
                     $i=0;
                     foreach ($arr as $value)
                     {
                         $model_lan = Languages::find()->where(['id'=>$value])->one();
                         $lang .= $model_lan->name.' ';
                     }
                     return $lang;
                },],
                'course_completion_date',
                ['class' => 'yii\grid\ActionColumn'],],
        ]); ?>