Php Yii与联结表的关系

时间:2014-09-19 08:18:22

标签: php yii relational-database junction-table

在我的项目中的一个视图中,我需要显示使用两个表中数据的表,但其中一个是juction表。

我有两个表用户技能。这两者之间的关系是多对多的,所以我创建了联结表 StudentSkills

这个juction表通常不会只有 id_user id_skill ,而且还有给定的id对唯一的百分比值 - 那个' s为什么它在联络表中,即使你不应该把其他任何东西作为一种良好的做法。

在视图中的所述表中,我需要显示技能表中包含名称的行和 StudentSkills 百分比 >证书用户的联结表。

这是我的观点:

<?php 
    $this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'skills-grid',
        'dataProvider'=>$model->with('student_skills')->searchWithStudentId($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'=>Yii::t('MainTrans', 'Name'),
                'value' => '$data->name',
                                        ),
            array(
                'name'=>'percentage',
                'header' => Yii::t('MainTrans', 'Success rate %'),
                'value' => '$data->student_skills->percentage',
                 ),
            ),
    ));

?>

这是我在Skill $模型中的搜索和关系:

public function relations()
{
    return array(
        //the first two relations were generated by gii
        'problems' => array(self::MANY_MANY, 'Problems', 'problem_skill(id_skill, id_problem)'),
        'users' => array(self::MANY_MANY, 'User', 'student_skills(skill_id, student_id)'),

        //this is what tired to do
        'student_skills' => array(self::HAS_MANY, 'StudentSkills', 'skill_id'),
    );
}

public function searchWithStudentId($studentId)
{
    // my custom search to find all records with certain user_id

    $criteria=new CDbCriteria;

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

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

    $criteria->compare('student_skills.student_id',$studentId);

    return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            'pagination'=>array(
                    'pageSize'=>25,
            ),
            'sort'=>array(
                    'defaultOrder'=>array(
                            'title'=>CSort::SORT_ASC
                    )
            ),
    ));
}

当我尝试渲染页面时,我收到错误:尝试获取非对象的属性

我知道我的代码有问题,而且很可能与关系有关,但我找不到任何东西。

有人可以帮助解决这个问题而无需创建新表吗?

由于

1 个答案:

答案 0 :(得分:0)

问题是您使用的是HAS_MANY关系,这意味着每个Skill模型都有 1 StudentSkill。你得到一个student_skills的数组,所以你需要用它做一些事情。例如,获取数组中的第一个百分比

$data->student_skills[0]->percentage

或计算给定技能的平均百分比

array_sum($data->student_skills)/count($data->student_skills)