Yii2 - Викторина - Работа с таблицей «многие ко многим» - PullRequest
0 голосов
/ 03 мая 2019

Мне нужна разработка чего-то похожего на викторину. У меня есть 3 таблицы: quiz, quiz_questions, quiz_questions_answers.

Я отображаю вопросы / ответы в форме.

<?php foreach ($modelQuestions as $modelQuestion): ?>
            <?= $modelQuestion->question ?> <br/>
            <?= $form->field($modelMatch, 'answer[]')->textarea(['rows' => 6]) ?>
<?php endforeach; ?>

в контроллере мне нужно сохранить id_quiz и obs в таблице quiz, но мне нужно сохранить в таблице «многие ко многим» quiz_questions_answers как id_quiz, id_question и answer для каждого ответа ,

Я пытаюсь сделать это в цикле foreach, но как мне получить «id_question» для каждого ответа?

public function actionCreate()
    {
        $model = new Quiz();
        $modelMatch = new QuizQuestionsAnswers();
        $modelQuestions = QuizQuestions::find()->all();


        if ($model->load(Yii::$app->request->post()) && $modelMatch->load(Yii::$app->request->post())){
            $model->save();

            foreach ($modelMatch->answer as $answer) {
                    $modelMatch = new QuizQuestionsAnswers();
                    $modelMatch->id_quis = $model->id;
                    $modelMatch->id_question = ????;
                    $modelMatch->answer = $answer;
                    $modelMatch->save();
            }

            return $this->redirect(['view', 'id' => $model->id]);

        } else {
            return $this->render('create', [
                'model' => $model,
                'modelMatch' => $modelMatch,
                'modelQuestions' => $modelQuestions,
            ]);
        }
    }

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

база данных схемы:

enter image description here

1 Ответ

1 голос
/ 04 мая 2019

Вы должны добавить id_question в качестве скрытого ввода и предварительно заполнить поле, поскольку у вас уже есть вопрос, сохраненный в базе данных, и использовать табличный подход к именам полей. В начале вы должны иметь [], а неВ завершение, вы также должны сгруппировать ответ с вопросом, используя индекс $modelQuestions, чтобы ответ и вопрос, к которому он принадлежит, находились в отдельных массивах, см. код ниже

<?php foreach ($modelQuestions as $index=>$modelQuestion): ?>
    <?php echo $modelQuestion->question ?> <br/>
    <?php echo $form->field($modelMatch, "[$index]answer")->textarea(['rows' => 6]) ?>
    <?php echo Html::activeHiddenInput($model,"[$index]id_question",['value'=>$modelQuestion->id]) ?>
<?php endforeach;?>

Теперь, когда вы будетеотправьте свой запрос, чтобы увидеть ответы в массиве сообщений, как показано ниже

Array(
.....
    'QuizQuestionsAnswers'=>[
        [0]=>[

            'answer'=>'some answer'
            'id_question'=>1,
        ],
        [1]=>[
            'answer'=>'some answer',
            'id_question'=>2,
        ],
    ],
.....
)

Теперь вам следует сохранить каждый ответ.И для этого вы должны использовать transactions, чтобы, если какой-либо из ответов не был проверен в соответствии с правилами модели, он выдавал ошибку и не сохранял ни один из ответов или теста.

Вы должны изменить код на ниже

public function actionCreate()
{
    $model = new Quiz();
    $modelMatch = new QuizQuestionsAnswers();
    $modelQuestions = QuizQuestions::find()->all();

    if ($model->load(Yii::$app->request->post())) {
        $transaction = Yii::$app->db->beginTransaction();

        try {
            if (!$model->save()) {
                throw new \Exception(implode("<br />", ArrayHelper::getColumn($model->errors, '0')));
            }

            foreach (Yii::$app->request->post('QuizQuestionsAnswers', []) as $answer) {
                $modelMatch = new QuizQuestionsAnswers();
                $modelMatch->id_quis = $model->id;
                $modelMatch->id_question = $answer['id_question'];
                $modelMatch->answer = $answer['answer'];
                if (!$modelMatch->save()) {
                    throw new \Exception(implode("<br />", ArrayHelper::getColumn($modelMatch->errors, '0')));
                }
            }

            $transaction->commit();

            return $this->redirect(['view', 'id' => $model->id]);
        } catch (\Exception $e) {
            $transaction->rollBack();
            Yii::$app->session->setFlash('danger', $e->getMessage());
        }

    }
    return $this->render('create', [
        'model' => $model,
        'modelMatch' => $modelMatch,
        'modelQuestions' => $modelQuestions
    ]);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...