@MaikMain
Начинающий backend - developer

DetailView и GridView. Вывод названия сточки в связанных таблицах. Yii2?

Подскажите пожалуйста, а то всю голову что сломал.
У меня есть 2 таблицы: одна с курсами (cource), а другая с авторами (author).
Я в "Курсе" во view() - в форме вывожу список авторов курсов:
<?php $authors = \common\models\Author::find()->where(['status' => 1])->all();
     $items = \yii\helpers\ArrayHelper::map($authors,'id','name');
     $params = ['prompt' => '--- Укажите автора ---'];
     echo $form->field($model, 'author',['options' => ['class' => 'col-xs-2']])->dropDownList($items,$params);
?>

При сохранении, в поле "author" таблицы "course" записывается id автора. В принципе так и нужно. Вот только я когда его вывожу в DetailView и GridView он не выводится и пишет "(not set)":
<?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'id',
            [
                'attribute' => 'category_id',
                'value' => function($data){
                    return $data->category->name;
                },
            ],
            'name',
            'content:raw',
            [
                'attribute' => 'author',
                'value' => function($model){
                    return $model->author->name;
                },
            ],
            'description',
            [
                'attribute' => 'statusName',
                'value' => function($model) {
                     return  Html::tag('span',
                                $model->getStatusName(),
                                ['class' => 'label label-' . ArrayHelper::getValue([0 => 'danger', 1 => 'success'], $model->status_id)]
                            );
                    },
                'format' => 'raw',
            ],
            'smallImage:image',
        ],
    ]) ?>

и
<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        [
            'class' => 'yii\grid\ActionColumn',
            'header' => 'Действия',
            'options' => ['width' => '10']
        ],
        [
            'attribute' => 'category_id',
            'value' => function ($data) {
                return $data->category->name;
            },
            'options' => ['width' => '200']
        ],
        'name',
        [
            'attribute' => 'author',
            'value' => function ($data) {
                return $data->author->name;
            },
            'options' => ['width' => '200']
        ],
        'smallImage:image',
        [
            'attribute' => 'status_id',
            'filter' => \common\models\Course::getStatusList(),
            'value' => 'statusName',
        ],
    ],
]); ?>

Таблицы связывал вот так:
1. Author:
public function getCourse()
    {
        return $this->hasMany(Course::className(), ['author' => 'id']);
    }

2. Course:
public function getAuthor()
    {
        return $this->hasOne(Author::className(), ['id' => 'author']);
    }


Подскажите пожалуйста в чем может быть проблема? За ранее большое спасибо))
  • Вопрос задан
  • 423 просмотра
Решения вопроса 1
slo_nik
@slo_nik
Добрый вечер.
Эти две строки необходимо вынести в отдельный метод.
$authors = \common\models\Author::find()->where(['status' => 1])->all();
     $items = \yii\helpers\ArrayHelper::map($authors,'id','name');

Покажите запрос к базе, который Вы используете для GridView и DetailView. Вы указываете там связь?
Должно быть приблизительно так:
$query = Author::find()->with('course');
// далее подставляете это в ActiveDataProdiver


p.s. В value не совсем правильно Вы передаёте параметр в функцию.
'value' => function ($model) {
                return $model->author->name;
            },

Но можно и так написать.
'value' => 'author.name'
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MaikMain Автор вопроса
Начинающий backend - developer
slo_nik, Все получилось. Нужно было сделать как Вы и сказали. Переименовать author в author_id и 'value' => 'author.name',
Спасибо большое, Вы мне очень помогли. Я Вам благодарен. Большое спасибо)))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Max.Credit Санкт-Петербург
от 150 000 до 150 000 руб.
Willz Москва
от 150 000 руб.
Fmedia Санкт-Петербург
от 40 000 до 100 000 руб.