Php Yii 与联结表的关系
Posted
技术标签:
【中文标题】Php Yii 与联结表的关系【英文标题】:Php Yii relations with junction table 【发布时间】:2014-09-19 08:18:22 【问题描述】:在我的项目的一个视图中,我需要显示使用来自两个表的数据的表,但其中一个是连接表。
我有两个表 User 和 Skill。这两者之间的关系是多对多的,所以我创建了联结表 StudentSkills。
这个联结表不仅像往常一样具有 id_user 和 id_skill,而且对于给定的一对 id 来说,它还具有唯一的百分比值 - 这就是为什么它甚至在联结表中如果你不应该把其他任何东西放在那里作为一个好的做法。
在视图中的所述表中,我需要显示包含 Skill 表中的 Name 和 StudentSkills 中的 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'=>$model->with('student_skills')->searchWithStudentId($id),
中写了student_skills
,然后在searchWithStudentId()
函数中,你又得到了$criteria->with = array('student_skills');
尝试将'dataProvider'=>$model->with('student_skills')->searchWithStudentId($id),
更改为'dataProvider'=>$model->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 与联结表的关系的主要内容,如果未能解决你的问题,请参考以下文章