Вставка нескольких данных в базу данных в Yii 2

У меня проблема с моим кодом, когда я пытаюсь сохранить несколько данных в базу данных одновременно, это мой код для сохранения в базу данных:

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');

каждый раз, когда я пытаюсь сохранить, я получаю только последний массив данных, который можно сохранить в базе данных. кто-нибудь может мне помочь? или если кто-то может предоставить учебник, это будет реальная помощь.

5 ответов

  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();
    }
    

Надеюсь, что этот код поможет полностью.

Вы должны каждый раз создавать новый объект модели. Или иначе ты просто перезаписываешь.

  1. Вы можете использовать Yii Command Builder для достижения этой цели.
$command = Yii::app()->db->createCommand();

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

и так далее.

  1. Запишите этот код в цикле, и он будет вставлять все записи одну за другой.

Вы можете использовать Yes It 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();

Проверьте ссылку для этого.

Я думаю, что пакетная вставка является лучшим решением для этой проблемы.

но есть одна проблема с вашим изображением кода: этот код создаст только одну строку данных (первую строку) в таблице данных и обновится до той же модели

Решение для вашего кода

 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');
foreach ($data as $key=>$value) {
   $model = new ModelNeme(); //optional
   $model->route = $_POST['name'][$key];
   $model->save();
}
return $this->redirect('index');
Другие вопросы по тегам