Search code examples
yiirelationjoincgridview

Displaying value from join table in Yii CgridView


I have this very simple table in my view and I'm trying to display value from joined table:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'skills-grid',
    'dataProvider'=>$model->searchWithStudentSuccessRate($id),
    'template' => '{items}{pager}',
    'cssFile'=>Yii::app()->request->baseUrl. '/themes/'. Yii::app()->theme->name.'/css/table.css',
    'htmlOptions'=>array('class'=>'datagrid', 'style'=>'width:550px;'),
    'columns'=>array(
        array(
            'name'=>'name',
        ),
        array(
            'name' => 'value',
            'header' => Yii::t('MainTrans', 'Value'),
            'value' => '$data->student_skills->value',
        ),
        array(
            'name' => 'successRate',
            'header' => Yii::t('MainTrans', 'Success Rate'),
            'value' => '$data->successRate."%"',
        ),
    ),

));

And this is the search function:

public function searchWithStudentSuccessRate($id)
{
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('name',$this->name,true);
    $criteria->compare('t.threshold',$this->threshold);

    $criteria->with = array('student_skills');
    $criteria->together = true;

    $criteria->select = array('IFNULL(CASE WHEN ROUND((student_skills.value/t.threshold)*100,0) > 100 THEN 100 ELSE ROUND((student_skills.value/t.threshold)*100,0) END,0) as successRate','*');

    $criteria->group = "t.name";
    $criteria->condition = 'student_skills.student_id = '.$id;

    $criteria->compare('successRate',$this->successRate);
    $criteria->compare('student_skills.value',$this->value);


    return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            'pagination'=>array(
                    'pageSize'=>25,
            ),
            'sort'=>array(
                    'defaultOrder'=>array(
                            'successRate'=>CSort::SORT_DESC,
                    ),
                    'attributes'=>array(
                            'successRate'=>array(
                                    'asc'=>'successRate',
                                    'desc'=>'successRate DESC',
                            ),
                            '*',
                    ),
            ),
    ));
}

But I get error: "Trying to get property of non-object" when I added value column to my CGridView.

Everything works fine without column value (columns successRate and name are fine). Relation should be fine as well. The error I get means that the value doesn't exist but it should since I did something similar in my other views and there it works.

Can anyone tell what's wrong? I'm sure it's something minor but I'm struggling with this embarrasing problem for a while.

Thanks


Solution

  • It means that in some conditions $data->student_skills is NULL. Try change this:

    'value' => '$data->student_skills->value',
    

    to this

    'value' => 'empty($data->student_skills) ? null : $data->student_skills->value',