Php Yii 与联结表的关系

Posted

技术标签:

【中文标题】Php Yii 与联结表的关系【英文标题】:Php Yii relations with junction table 【发布时间】:2014-09-19 08:18:22 【问题描述】:

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

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

这个联结表不仅像往常一样具有 id_userid_skill,而且对于给定的一对 id 来说,它还具有唯一的百分比值 - 这就是为什么它甚至在联结表中如果你不应该把其他任何东西放在那里作为一个好的做法。

在视图中的所述表中,我需要显示包含 Skill 表中的 NameStudentSkills 中的 percentage 的行> 一个认证用户的联结表。

这是我的看法:

<?php 
    $this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'skills-grid',
        'dataProvider'=>$model->with('student_skills')->searchWithStudentId($id),
        'template' => 'itemspager',
        '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',
                 ),
            ),
    ));

?>

这是我在技能 $model 中的搜索和关系:

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
                    )
            ),
    ));

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

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

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

谢谢

【问题讨论】:

你在'dataProvider'=&gt;$model-&gt;with('student_skills')-&gt;searchWithStudentId($id),中写了student_skills,然后在searchWithStudentId()函数中,你又得到了$criteria-&gt;with = array('student_skills'); 尝试将'dataProvider'=&gt;$model-&gt;with('student_skills')-&gt;searchWithStudentId($id),更改为'dataProvider'=&gt;$model-&gt;searchWithStudentId($id), @KunalDethe - 我在第二篇文章中尝试了你的建议,但没有奏效。我真的不明白你的第一条评论想说什么...... 【参考方案1】:

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

$data->student_skills[0]->percentage

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

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

【讨论】:

谢谢。你的建议奏效了,我使用了 $data->student_skills[0]->percentage

以上是关于Php Yii 与联结表的关系的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 Activerecord 从联结表中获取字段并根据它们排序

yii-user extension,如何正确创建新关系?

第十五章联结表

第十五章 联结表

如何在实体关系图中表示联结表?

Yii 2:同一张表的多重关系