@sanex3339

Yii2. Как последовательно связать 3 таблицы?

Появилась проблема.
Есть 3 таблицы Tests, Questions, Answers, которые связаны последовательно.
Вот картинку нашел для примера, но у меня связи 1-ко-многим.
has_one_through.png

Как мне в Yii2 сделать так, что бы одним запросом вывести данные из всех 3-х таблиц, с сохранением на выходе правильной иерархии (используя asArray())?

В модели Test прописал вот такой код, но это не правильно, судя по всему.
public function getQuestion()
    {
        return $this->hasMany(Question::className(), ['test_id' => 'id']);
    }

    public function getAnswer()
    {
        return $this->hasMany(Answer::className(), ['question_id' => 'id'])
        ->viaTable(Question::tableName(), ['test_id' => 'id']);
    }


С 2-мя таблицами проблем нет. Запрос вида:
$test = Test::find()->asArray()->joinWith('question')->where(['tests.id'=>$id])->all();

выдает такой массив:
Array
(
    [id] => 2
    [name] => Тестовый тест №2
    [question] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [test_id] => 2
                    [question] => сколько будет 2+3?
                )

            [1] => Array
                (
                    [id] => 3
                    [test_id] => 2
                    [question] => Столица России?
                )
        )
)


Я же хочу получить вот такой результат:
Array
(
    [id] => 2
    [name] => Тестовый тест №2
    [question] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [test_id] => 2
                    [question] => сколько будет 2+3?
                    [answer] => Array
                         (
                              [0] =>Array
                                  (
                                       [id] => 1
                                       [question_id] => 1
                                       [answer] => 4
                                       [is_right_answer] => false
                                  )

                             [1] =>Array
                                  (
                                       [id] => 2
                                       [question_id] => 1
                                       [answer] => 5
                                       [is_right_answer] => true
                                  )
                           
                             [2] =>Array
                                  (
                                       [id] => 3
                                       [question_id] => 1
                                       [answer] => 6
                                       [is_right_answer] => false
                                  )
                )

            [1] => Array
                (
                    [id] => 3
                    [test_id] => 2
                    [question] => Столица России?
                    [answer] => Array(...)
                )
        )
)
  • Вопрос задан
  • 6408 просмотров
Решения вопроса 1
1. если у вас hasMany, называйте во множественном числе - getQuestions, getAnswers
2. ->joinWith(['questions', 'questions.answers'])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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