2014-09-19 5 views
0

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

У меня есть две таблицы Пользователь и Навык. Связь между этими двумя - это многие-ко-многим, поэтому я создал таблицу соединений StudentSkills.

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

сказал В таблице в представлении мне нужно отобразить строки, содержащие Имени от мастерства таблицы и процента от StudentSkills спая стола из пользователя certion.

Это мое мнение:

<?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

Вы написали 'student_skills' в' 'DataProvider' => $ модельно> с ('student_skills') -> searchWithStudentId ($ id), 'а затем в' searchWithStudentId() 'функция, у вас снова есть' $ criteria-> with = array ('student_skills'); ' –

+0

Попробуйте изменить' dataProvider '=> $ model -> с ('student_skills') -> searchWithStudentId ($ id), 'to' 'dataProvider' => $ model-> searchWithStudentId ($ id), ' –

+0

@KunalDethe - Я попробовал ваше предложение во втором посте, но не сделал этого, t wor к. Я не понимаю, что вы хотели сказать по первому комментарию ... – Nugy

ответ

0

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

$data->student_skills[0]->percentage 

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

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

Спасибо. Ваше предложение сработало, я использовал $ data-> student_skills [0] -> процент – Nugy

Смежные вопросы