Php Yii отношения с соединительной таблицей

В одном из моих представлений в моем проекте мне нужно отобразить таблицу, которая использует данные из двух таблиц, но одна из них — таблица слияния.

У меня две таблицы пользователь а также Умение. Соотношение между этими двумя понятиями «многие ко многим», поэтому я создал соединительную таблицу. StudentSkills.

Этот столик не только имеет id_user а также id_skill как обычно, но также и процентное значение, которое является уникальным для данной пары идентификаторов — поэтому оно находится в соединительной таблице, даже если вы не должны помещать что-либо еще в качестве хорошей практики.

В указанной таблице в представлении мне нужно отобразить строки, содержащие название от Умение стол и процент от 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
)
),
));
}

Когда я пытаюсь отобразить страницу, я получаю сообщение об ошибке: Попытка получить свойство необъекта.

Я знаю, что с моим кодом что-то не так, и, скорее всего, это связано с отношениями, но я ничего не могу найти.

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

Спасибо

0

Решение

Проблема в том, что вы используете HAS_MANY отношение, которое означает, что каждый Skill модель имеет более 1 StudentSkill, Вы получаете массив student_skillsтак что с этим нужно что-то делать. Например получить первый процент в массиве

$data->student_skills[0]->percentage

или рассчитать средний процент для данного навыка

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]