Отображение значения из таблицы соединения в Yii CgridView

У меня есть эта очень простая таблица, и я пытаюсь отобразить значение из объединенной таблицы:

$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."%"',
        ),
    ),

));

А это функция поиска:

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',
                            ),
                            '*',
                    ),
            ),
    ));
}

Но я получаю сообщение об ошибке: «Попытка получить свойство не-объекта», когда я добавил столбец value в свой CGridView.

Все работает нормально без значения столбца (столбцы successRate и name в порядке). Отношения тоже должны быть в порядке. Ошибка, которую я получаю, означает, что значение не существует, но оно должно быть, поскольку я сделал что-то подобное в других моих представлениях, и там это работает.

Кто-нибудь может сказать, что случилось? Я уверен, что это что-то незначительное, но я некоторое время борюсь с этой неловкой проблемой.

Спасибо


person Nugy    schedule 10.12.2014    source источник


Ответы (1)


Это означает, что в некоторых условиях $data->student_skills равно NULL. Попробуйте изменить это:

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

к этому

'value' => 'empty($data->student_skills) ? null : $data->student_skills->value',
person Maug Lee    schedule 10.12.2014
comment
Возможно ли, что в каждом случае нет соответствующей записи student_skills? - person Larry Borsato; 17.12.2014