@ZaurK

Чем вызвана ошибка при вызове обратной функции в GridView?

Здравствуйте! В yii2 у меня опыта маловато, вызвал затруднения один момент.
В GridView в одной из колонок выводится некоторый параметр id_quiz, мне нужно заменить этот id_quiz на соответствующий ему заголовок.
<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            //'id',
            'id_user',
            'result:ntext',
            [
            'attribute'=>'id_quiz',
            'value' => function ($model, $service) {
                return  $service->getQuizTitleById($model->id_quiz);
            },
            ],

        // тут некоторый код
        ],
    ]); ?>

Модели $model, $service я объявляю, и в объекте $service есть метод getQuizTitleById, который должен заменить id на заголовок
public function getQuizTitleById($order_quiz)
    {
        $my_quiz = Quiz::find()
                         -> where(['id' => $order_quiz])
                         -> one();
        return $my_quiz['quiztitle'];
    }

Но получаю ошибку "Call to a member function getQuizTitleById() on integer", правильно ли вообще так вызывать функцию?
  • Вопрос задан
  • 33 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
AR возвращает объект, а Вы его используете как массив, так что наверное не
return $my_quiz['quiztitle'];
правильно
return $my_quiz->quiztitle;
или же в запросе использовать asArray()
НО!!! Это гавнокод. Для подобных целей в yii2 есть связи. Все просто: Должен быть метод getQuiz который реализует связь:
public function getQuiz()
    {
        return $this->hasOne(Quiz::class,['id' => 'id_quiz']);
    }

а в gridview достаточно будет
'columns' => [
....
'quiz.quiztitle'
....
]


Оф Док на тему:
https://www.yiiframework.com/doc/guide/2.0/en/db-a...
Видео на тему:
https://youtu.be/v9wfyGOoGR8?list=PLOm4dl-NavgyBnt...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы