我有一个调查应用程序,有很多问题。每个问题都有以无线电列表形式显示的选项。 我在for循环中使用 ActiveForm 和 RadioList ,以便从数据库中获取所有问题和选项。 打印问题和选项就可以了,但是
当我尝试将答案保存到数据库时,它仅保存了最后一个选项。
在我的保存操作中,我尝试放置一个foreach循环以保存每个答案,但这对我不起作用。
我试图将 $ model->保存和 $ request-> post('Questions')进行var_dump,有所有选择的选项,不仅是最后一个
型号: 这只是规则:
public function rules(){
return[
[['id','question_id', 'option_id'], 'required']
];
}
查看:
<?php $form = ActiveForm::begin([
'id' => 'my-form-id',
'action' => ['answers/save'],
]
);
?>
<?php $questions = Questions::find()->orderBy('id ASC')->all(); ?>
<?php for ($i=0; $i<count($questions); $i++): ?>
<?= Html::encode("{$questions[$i]->title}") ?>
<?php $options = Options::find()->where (['question_id'=>$questions[$i]->id])->orderBy('id ASC')->all();
$options = ArrayHelper::map($options,'id', 'title');
?>
<label class="container" >
<?= $form->field($model, 'option_title')->radioList(
$options,
['name'=>'Questions['.$questions[$i]->id.']',
'separator' => '<br>',
])->label(false) ?>
</label>
<?php endfor; ?>
<?= Html::submitButton('Save', ['class' => 'btn btn-primary']) ?>
<?php ActiveForm::end(); ?>
控制器:
public function actionSave(){
$model = new Answers();
$request = \Yii::$app->request;
foreach($request->post('Questions') as $key=>$value) {
$model->load($request->post());
$model->option_id = $value;
$model->question_id = $key;
$model->save();
}
}
对不起,如果这是一个显而易见的问题,但我真的不知道该怎么做。谷歌搜索也没有帮助。 如果您有任何想法,请分享
答案 0 :(得分:1)
您需要在循环内移动$model = new Answers();
,因为需要通过在post数组上循环来保存所有复选框,因此每次应创建一个新对象,然后将其保存。只需将代码更改为以下
public function actionSave(){
$request = \Yii::$app->request;
foreach($request->post('Questions') as $key=>$value) {
$model = new Answers();
$model->load($request->post());
$model->option_id = $value;
$model->question_id = $key;
$model->save();
}
}
此外,在处理相关或多个记录时,还应该使用事务块,例如在这种情况下,应该保存所有记录,或者在出现任何错误或异常时不保存所有记录,当前情况并非如此。如果第4个复选框发生异常或错误,您仍将保存前3个复选框值。尝试如下包装代码
public function actionSave(){
$request = \Yii::$app->request;
//start transaction
$transaction=Yii::$app->db->beginTransaction();
try{
foreach ($request->post('Questions') as $key => $value) {
$model = new Answers();
$model->load($request->post());
$model->option_id = $value;
$model->question_id = $key;
$model->save();
}
//commit the transaction to save the records
$transaction->commit();
}catch(\Exception $e){
//rollback the transaction so none of the checkboxes are saved
$transaction->rollBack();
//do your stuff intimate the user by adding the message to a flash and redirecting
}
}