2015-03-26 15 views
5

Ho problemi con il mio codice quando sto cercando di salvare più dati in database, allo stesso tempo, questo è il mio codice per salvare nel database:inserire più dati nella banca dati in 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'); 

ogni Sto cercando di salvare, sto solo ottenendo l'ultimo array di dati può salvare nel database. qualcuno potrebbe aiutarmi? o se qualcuno potesse fornire un tutorial, sarebbe un vero aiuto.

+1

è possibile utilizzare batchInsert() per inserire più record alla volta. Per ulteriori dettagli: http://www.yiiframework.com/doc-2.0/yii-db-command.html#batchInsert%28%29-detail – Chinmay

+0

@chinmay grazie, è così utile –

risposta

2

È necessario creare un nuovo oggetto del modello ogni volta. O altrimenti stai solo sovrascrivendo.

+0

Non quando si utilizza il comando db di Yii . http://www.yiiframework.com/doc-2.0/yii-db-command.html - L'utilizzo di un oggetto in un ciclo sarebbe molto inefficiente e una soluzione terribile, soprattutto per quantità potenzialmente elevate di dati. Hai davvero intenzione di caricare un oggetto 1.000 volte in un ciclo per importare 1.000 articoli? Ecco una ripartizione side-by-side che mostra le differenze e gli usi: http://www.bsourcecode.com/yiiframework2/insert-query/ - Per l'op, guarda l'inserto batch come risposto @Kailas. Per importazioni molto grandi, suddividere i dati in batch di 500 dire/loop. –

+0

Domanda: Una delle API che sto usando (che è terribile) restituisce tutti i record (circa 3.000 in totale) - voglio fare un caricamento in batch ma solo di nuovi record e record alterati, come farei senza un ciclo foreach ? – DrBorrow

1
  1. È possibile utilizzare il generatore di comandi Yii per ottenere ciò.
$command = Yii::app()->db->createCommand(); 

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

e così via.

  1. Scrive questo codice in ciclo e inserisce tutti i record uno dopo l'altro.
+0

non accorcia la durata del nostro negozio? cz se ho 250000 dati allora ho bisogno di scrivere 250000 volte nella mia memoria, invece di scrivere solo una volta con una dimensione più grande per scrivere? o sarà lo stesso risultato per il nostro deposito ?? –

7
  1. creare una matrice da loop i valori multipli.

    $data- has multiple values 
    $bulkInsertArray = array(); 
    foreach($data as $value){ 
        $bulkInsertArray[]=[ 
         'columnName1'=>$value[0][1], 
         'columnName2'=>$value[0][2], 
         'columnName3'=>$value[0][3] 
        ]; 
    } 
    
  2. check $ bulkInsertArray a non vuota

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

Spero che questi codice è aiuto pieno.

+0

molto utile! grazie. – DrBorrow

0

È possibile utilizzare Sì È Inserisci gruppo per inserire più righe. E 'più veloce di qualsiasi dei modi indicati qui:

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

Controllare il link per this.