我有一个有很多问题的调查应用程序。每个问题都有以radiolist 形式呈现的选项。我在 for 循环中使用ActiveForm和RadioList以便从数据库中获取所有问题和选项。打印问题和选项一切正常,但是
当我尝试将答案保存到数据库时,它只保存最后一个选项。
在我的保存操作中,我尝试放置一个 foreach 循环以保存每个答案,但它对我不起作用。
我试图 var_dump $model->save和$request->post('Questions')有所有选定的选项,而不仅仅是最后一个。
模型:这里只是规则:
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();
}
}
对不起,如果这是明显的问题,但我真的不明白该怎么做。谷歌搜索也没有帮助。如果您有任何想法,请分享
您需要移动$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
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句