如何在 yii2 activeForm 中保存多个无线电的值?

How to save values of multiple radios in yii2 activeForm?

我有一个有很多问题的调查应用程序。每个问题都有以单选列表形式呈现的选项。 我在 for 循环中使用 ActiveFormRadioList 以便从数据库中获取所有问题和选项。 打印问题和选项一切正常,但

当我尝试将答案保存到数据库时,它只保存了最后一个选项。

在我的保存操作中,我尝试放置一个 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 
  }
}