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

时间:2019-07-16 08:41:33

标签: php yii2 radio-button active-form

我有一个调查应用程序,有很多问题。每个问题都有以无线电列表形式显示的选项。 我在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();
  }
}

对不起,如果这是一个显而易见的问题,但我真的不知道该怎么做。谷歌搜索也没有帮助。 如果您有任何想法,请分享

1 个答案:

答案 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 
  }
}