2015-03-26 12 views
5

Mam problem z mojego kodu gdy próbuję zapisać wiele danych do bazy danych w tym samym czasie, to jest mój kod, aby zapisać w bazie danych:wstawić wiele danych do bazy danych w 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'); 

każdy Próbuję zapisać, otrzymuję tylko ostatnią tablicę danych, którą można zapisać do bazy danych. czy ktoś mógłby mi pomóc? lub jeśli ktoś mógłby zapewnić samouczek, byłoby to prawdziwą pomocą.

+1

można użyć funkcji wsadowej(), aby wstawić wiele rekordów naraz. Aby uzyskać więcej informacji: http://www.yiiframework.com/doc-2.0/yii-db-command.html#batchInsert%28%29-detail – Chinmay

+0

@ chinmay dziękuję, jest tak przydatna –

Odpowiedz

2

Za każdym razem trzeba utworzyć nowy obiekt modelu. Lub Else youre Just overwriting.

+0

Nie, gdy używasz polecenia db Yii . http://www.yiiframework.com/doc-2.0/yii-db-command.html - Używanie obiektu w pętli byłoby bardzo nieefektywne i straszliwe, zwłaszcza w przypadku potencjalnie dużych ilości danych. Czy naprawdę chcesz załadować obiekt 1000 razy w pętli, aby zaimportować 1000 przedmiotów? Poniżej znajduje się zestawienie side-by-side pokazujące różnice i zastosowania: http://www.bsourcecode.com/yiiframework2/insert-query/ - Do op, spójrz na wstawkę wsadową jako odpowiedź @Kaila. W przypadku naprawdę dużych importów, podziel dane na partie, powiedzmy 500/loop. –

+0

Pytanie: Jeden z używanych przeze mnie API (który jest okropny) zwraca wszystkie rekordy (w sumie około 3 000) - chcę zrobić wsadowe przesyłanie, ale tylko nowe rekordy i zmienione rekordy, w jaki sposób mogę to zrobić bez pętli foreach ? – DrBorrow

1
  1. Możesz użyć programu budującego polecenia Yii, aby to osiągnąć.
$command = Yii::app()->db->createCommand(); 

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

i tak dalej.

  1. Wpisz ten kod w pętli, aby wstawić wszystkie rekordy jeden po drugim.
+0

czy nie skróci to naszego życia w sklepie? cz jeśli mam 250000 danych to muszę napisać 250000 razy do mojego magazynu, a nie tylko napisać jeden raz z większym rozmiarem do napisania? czy to da taki sam wynik w naszym magazynie? –

7
  1. Utwórz tablicę poprzez zapętlenie swoich wielu wartości.

    $data- has multiple values 
    $bulkInsertArray = array(); 
    foreach($data as $value){ 
        $bulkInsertArray[]=[ 
         'columnName1'=>$value[0][1], 
         'columnName2'=>$value[0][2], 
         'columnName3'=>$value[0][3] 
        ]; 
    } 
    
  2. Sprawdź $ bulkInsertArray w nie jest pusta

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

nadzieję, że te kod jest pomóc całości.

+0

bardzo pomocne! Dziękuję Ci. – DrBorrow

0

Możesz użyć opcji Tak, aby jest wsadowym wsadem, aby wstawić wiele wierszy. Jest szybszy niż którykolwiek ze sposobów podanych tutaj:

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

Sprawdź link do this.

Powiązane problemy