Yii2 在 actionCreate 中使用 foreach 循环在数据库中保存多个数据

Yii2 Save multiple data in the db using foreach loop in actionCreate

在我的项目中,我想使用 foreach 循环一次插入多行数据。我有一个包含元素数组的变量。

例如,如果我的数组有 3 个不同的元素。我想将所有这 3 个元素保存在 3 个不同的 db table 行中。我还有其他所有 3 个数组元素都相同的列。

我已将它们放在 foreach 语句中,但只有第一个元素被保存。有什么方法可以实现吗?

我的代码

public function actionCreate($prodID)
    {
        $model = new ProductlinesStorage();

        if ($model->load(Yii::$app->request->post())) {
           $productlineID = Productlines::find()->where(['area_id' => $model->productline_id, 'product_id' => $prodID])->all();

           foreach ($productlineID as $singleProductlineID) {
                $model->productline_id = $singleProductlineID->productline_id;
                $model->user_id = Yii::$app->user->identity->user_id;
                $model->isNewRecord = true;
                $model->save();  
            }  
            return $this->redirect(['/product/storage?id='.$prodID]);
        } else {
            return $this->renderAjax('create', [
                'model' => $model,
                'prodID' => $prodID,
            ]);
        }
    }

只有 productline_id 不同,其他列将具有所有 prdouctline_id 的相同数据。

谢谢!!!

也许你可以修改我的代码

   public function actionCreate()
   {
       $model = new SemesterPendek();
      $model->user_id = \Yii::$app->user->identity->id;
      $model->npm = \Yii::$app->user->identity->username;


        $modelsNilai = [new Nilai];


       if ($model->load(Yii::$app->request->post())){
         $model->waktu_daftar = date('Y-m-d h:m:s');

         $model->save();

   $modelsNilai = Tabular::createMultiple(Nilai::classname());
           Tabular::loadMultiple($modelsNilai, Yii::$app->request->post());


           // validate all models
           $valid = $model->validate();
           $valid = Tabular::validateMultiple($modelsNilai) && $valid;

           if ($valid) {
               $transaction = \Yii::$app->db->beginTransaction();
               try {
                   if ($flag = $model->save(false)) {
                       foreach ($modelsNilai as $indexTools =>$modelNilai) {
                           $modelNilai->id_sp = $model->id;
                       //    $modelNilai->user_id = \Yii::$app->user->identity->id;

                           if (! ($flag = $modelNilai->save(false))) {
                               $transaction->rollBack();
                               break;
                           }
                       }
                   }
                   if ($flag) {
                       $transaction->commit();
                       return $this->redirect(['view', 'id' => $model->id]);
                   }
               } catch (Exception $e) {
                   $transaction->rollBack(); \Yii::$app->session->setFlash('error','gagal');
               }

       }

       } else {
           return $this->render('create', [
               'model' => $model,
                'modelsNilai' => (empty($modelsNilai)) ? [new Nilai] : $modelsNilai,



           ]);
       }
   }

您只有一个模型对象,并且您只保存到它。 试试这个:

public function actionCreate($prodID)
{
    $model = new ProductlinesStorage();

    if ($model->load(Yii::$app->request->post())) {
       $productlineID = Productlines::find()->where(['area_id' => $model->productline_id, 'product_id' => $prodID])->all();

       foreach ($productlineID as $singleProductlineID) {
            $model = new ProductlinesStorage();
            $model->productline_id = $singleProductlineID->productline_id;
            $model->user_id = Yii::$app->user->identity->user_id;
            $model->isNewRecord = true;
            $model->save();  
        }  
        return $this->redirect(['/product/storage?id='.$prodID]);
    } else {
        return $this->renderAjax('create', [
            'model' => $model,
            'prodID' => $prodID,
        ]);
    }
}

您需要创建不同的对象以保存在不同的行中。 For 循环执行 3 次,但每次都更新同一个对象。您可以定义新对象并每次保存。下面的代码将起作用

public function actionCreate($prodID)
    {
        $model = new ProductlinesStorage();

        if ($model->load(Yii::$app->request->post())) {
           $productlineID = Productlines::find()->where(['area_id' => $model->productline_id, 'product_id' => $prodID])->all();

           foreach ($productlineID as $singleProductlineID) {
                $model = new ProductlinesStorage();
                $model->productline_id = $singleProductlineID->productline_id;
                $model->user_id = Yii::$app->user->identity->user_id;
                $model->isNewRecord = true;
                $model->save();  
            }  
            return $this->redirect(['/product/storage?id='.$prodID]);
        } else {
            return $this->renderAjax('create', [
                'model' => $model,
                'prodID' => $prodID,
            ]);
        }
    }