【问题标题】:Insert multiple data into database in Yii 2在 Yii 2 中将多个数据插入数据库
【发布时间】:2020-11-13 18:39:48
【问题描述】:

当我尝试将多个数据同时保存到数据库时,我的代码出现问题,这是我要保存到数据库的代码:

foreach ($data as $value) {
   $model->route = $value[0][1];
   $model->begin_point = $value[0][2];
   $model->begin_point = $value[0][3];
   $model->save();
}
return $this->redirect('index');

每一次我试图保存,我只得到最后一个数据数组可以保存到数据库中。有人可以帮助我吗?或者如果有人可以提供教程,那将是一个真正的帮助。

【问题讨论】:

标签: php yii2


【解决方案1】:
  1. 通过循环多个值来创建一个数组。

    $data- has multiple values
    $bulkInsertArray = array();
    foreach($data as $value){
       $bulkInsertArray[]=[
           'columnName1'=>$value[0][1],
           'columnName2'=>$value[0][2],
           'columnName3'=>$value[0][3]
       ];
    }
    
  2. 检查 $bulkInsertArray 是否为空

    if(count($bulkInsertArray)>0){
        $columnNameArray=['columnName1','columnName2','columnName3'];
        // below line insert all your record and return number of rows inserted
        $insertCount = Yii::$app->db->createCommand()
                       ->batchInsert(
                             $tableName, $columnNameArray, $bulkInsertArray
                         )
                       ->execute();
    }
    

希望这些代码可能会有所帮助。

【讨论】:

  • 这很好用。您可以使用 YourModelName::getTableSchema()->name 获取 tableName
【解决方案2】:

您必须每次都创建模型的新对象。否则你只是覆盖。

【讨论】:

  • 当你使用 Yii 的 db 命令时不会。 yiiframework.com/doc-2.0/yii-db-command.html - 在循环中使用对象将是非常低效且糟糕的解决方案,尤其是对于潜在的大量数据。您真的要在循环中加载一个对象 1,000 次以导入 1,000 个项目吗?这是显示差异和用途的并排细分:bsourcecode.com/yiiframework2/insert-query - 对于操作,请查看@Kailas 回答的批量插入。对于非常大的导入,将数据分成 500 个/循环的批次。
  • 问题:我正在使用的 API 之一(这很糟糕)返回所有记录(总共约 3,000 条)-我想做批量上传,但只上传新记录和更改的记录,如何我在没有 foreach 循环的情况下这样做?
【解决方案3】:
  1. 您可以使用 Yii 命令生成器来实现这一点。
$command = Yii::app()->db->createCommand();

$command->insert('table_name',array('column_1'=>$value_1),
'column_2'=>$value_2));

等等。

  1. 在循环中编写此代码,它将依次插入所有记录。

【讨论】:

  • 这不会缩短我们的商店寿命吗? cz 如果我有 250000 条数据,那么我需要向我的存储写入 250000 次,而不是只写入一次更大容量的写入?还是它会给我们的存储同样的结果??
【解决方案4】:

您可以使用 Yes It Is Batch Insert 来插入多行。它比此处所述的任何方式都快:

$connection->createCommand()->batchInsert('table_name', ['table_column_1', 'table_column_2'], [
    ['column_1_data_a', 'column_2_data_a'],
    ['column_1_data_b', 'column_2_data_b'],
    ['column_1_data_c', 'column_2_data_c'],
])->execute();

检查this的链接。

【讨论】:

    【解决方案5】:

    我认为批量插入是解决这个问题的最佳方案。

    但是您的代码图片存在一个问题,即 此代码将在数据表中仅创建一个数据行(第一行)并更新到同一模型

    您的代码的解决方案是

     foreach ($data as $value) {
        $model = new Model(); // creating new instance of model 
        $model->route = $value[0][1];
        $model->begin_point = $value[0][2];
        $model->begin_point = $value[0][3];
        $model->save();
      }
      return $this->redirect('index');
    

    【讨论】:

      【解决方案6】:
      foreach ($data as $key=>$value) {
         $model = new ModelNeme(); //optional
         $model->route = $_POST['name'][$key];
         $model->save();
      }
      return $this->redirect('index');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-26
        • 2014-06-08
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多