Вы должны добавить 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
]);
}