2015-04-11 8 views
7

Ich frage mich, wie Sie eine Bulk-Datenbank INSERT in Yii2 tun?Wie mache ich eine Bulk-Datenbank einfügen in Yii2?

Zum Beispiel eines normalen INSERT ich so mochte:

$sql = $this->db("INSERT INTO some_table(id,my_value) VALUES(:id,:my_value)"); 
$sql->bindValues([':id' => $id, ':my_value' => $my_value]); 
$sql->execute(); 

Was nun, wenn ich einen Großteil INSERT schaffen wollte?

Ohne Werte konnte man es so etwas wie Bindung:

foreach ($foo as $bar) { 
    $data_sql .= '(' . $id . ',' "'" . $bar . "')," 
} 

$data_sql = rtrim($data_sql, ','); 

$sql = $this->db("INSERT INTO some_table(id,my_value) VALUES" . $data_sql); 
$sql->execute(); 

Aber wie kann man dies erreichen, wenn Sie immer noch die Werte binden möchten?

Bearbeiten: Diese Frage ist nicht das gleiche wie die verknüpfte, da ich nicht verwende.

Edit 2:

Im Idealfall wäre es gut, wenn es eine Lösung, die eine gewisse Flexibilität angeboten, wie zum Beispiel der Lage, die meisten Ihrer eigenen Syntax, als eine der Antworten unten geschrieben zu schreiben:

Yii::$app->db->createCommand()->batchInsert('tableName', ['id', 'title', 'created_at'], [ 
    [1, 'title1', '2015-04-10'], 
    [2, 'title2', '2015-04-11'], 
    [3, 'title3', '2015-04-12'], 
])->execute(); 

... bietet das nicht an. Für diese spezielle Situation muss ich die IGNORE Anweisung verwenden, die die obige Lösung nicht bietet.

+0

etwas wie INTO some_table Erstellen 'INSERT (id, my_value) VALUES (? ?,), (?,?) 'und Platzhalter füllen? –

+0

Nun, ich hatte daran gedacht, etwas Ähnliches zu tun, indem ich Zahlen an das Ende jedes Platzhalters anfügte, aber ich hoffte, dass es einen besseren Weg gab. – Brett

+0

möglich Duplikat von [ActiveRecord Batch einfügen (yii2)] (http://stackoverflow.com/questions/27355262/activerecord-batch-insert-yii2) – arogachev

Antwort

22

Es gibt eine spezielle batchInsert Methode dafür:? (?,) (? ?,)

Yii::$app->db->createCommand()->batchInsert('tableName', ['id', 'title', 'created_at'], [ 
    [1, 'title1', '2015-04-10'], 
    [2, 'title2', '2015-04-11'], 
    [3, 'title3', '2015-04-12'], 
])->execute(); 
+0

Ich nehme an, dies wird keine Validierung – tinybyte

+0

Ich nehme an, das hat die gleiche Sicherheit B. wenn Sie Werte binden, bei denen Sie die Daten nicht bereinigen müssen, bevor Sie sie übergeben? Das unglückliche Problem dabei ist, dass es nicht sehr flexibel ist, etwa wenn Sie andere Dinge in der Abfrage verwenden möchten, wie zum Beispiel 'INSERT IGNORE'. – Brett

+0

Diese Methode ist sicher, da sie spezielle Methoden für die Quotierung von Werten verwendet. Und wenn Sie brauchen, können Sie die letzte SQL-Abfrage extrahieren und ändern. –