如何在 yii2 activeForm 中保存多个无线电的值?
How to save values of multiple radios in yii2 activeForm?
我有一个有很多问题的调查应用程序。每个问题都有以单选列表形式呈现的选项。
我在 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();
}
}
此外,在处理相关记录或多个记录时,您还应该使用事务块,在这种情况下,您应该保存所有记录,或者 none 以防出现任何错误或异常,目前情况并非如此。如果异常或错误发生在第 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
}
}
我有一个有很多问题的调查应用程序。每个问题都有以单选列表形式呈现的选项。 我在 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();
}
}
此外,在处理相关记录或多个记录时,您还应该使用事务块,在这种情况下,您应该保存所有记录,或者 none 以防出现任何错误或异常,目前情况并非如此。如果异常或错误发生在第 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
}
}