Программирование, веб-кодинг

Yii2: Связанные модели в GridView

Yii2: Связанные модели в GridView

Есть, например, сущность - Challenges. И в её списке Gridview, хочу выводить колонку с названиями упражнений, которые в этот челленж входят. Эти упражнения хранятся в отдельной таблице Упражнения и связаны с Челленжами с помощью связаннной таблицы.

Для этого в GridView у Челленджей добавлю столбец, где буду выводить через пробел все упражнения, которые относятся к челленджу.

[
    'attribute'=>'challengeexercises',
    'label'=>'Упражнения',
    'format' => 'raw',
    'value'=>function($model){
        return implode(' ', $model->challengeexercisesLinks);
    },
],

Модель Челлендж:

class Challenge extends BaseModel
{
 public $newchallengeexercises; 
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'challenge';
    }
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
           ...
            [['newchallengeexercises','purpose'], 'safe'],
            [['challengeexercises_list'], 'each', 'rule' => ['integer']],
        ];
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
           ...
            'challengeexercises_list' => 'Упражнения в челленже',
        ];
    }
 public function behaviors()
 {
     return [
            [
             'class' => \voskobovich\behaviors\ManyToManyBehavior::className(),
             'relations' => [
                 'challengeexercises_list' => 'challengeexercises',
             ],
         ],
     ];
 }
 public function getChallengeexercises() 
 {
     return $this->hasMany(ElementExercise::className(), ['id' => 'exercise_id']) 
                    ->orderBy(['level'=>SORT_ASC])
                 ->viaTable('exercise_to_challenge_bind', ['challenge_id' => 'id']);
 }
 public function getChallengeexercisesLinks()
 {
        $selectedtagnames=array();
        foreach($this->challengeexercises_list as $tag) {
            $title = Html::encode(ElementExercise::findOne($tag)->name);
            $selectedtagnames[]=Html::a($title, Url::toRoute(['/element-exercise/view', 'id'=>$tag]), $linkOptions=array('class'=>'btn-xs btn btn-default muscles', 'title'=>$title, 'data-pjax' => '0'));
        }
        return $selectedtagnames;
 }...

Здесь создал связь getChallengeexercises()