mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-10 02:13:17 +08:00
Merge pull request #1309 from nineinchnick/batch-insert
support for batch insert in sqlite older than 3.7.11
This commit is contained in:
@ -41,6 +41,53 @@ class QueryBuilder extends \yii\db\QueryBuilder
|
||||
Schema::TYPE_MONEY => 'decimal(19,4)',
|
||||
];
|
||||
|
||||
/**
|
||||
* Generates a batch INSERT SQL statement.
|
||||
* For example,
|
||||
*
|
||||
* ~~~
|
||||
* $connection->createCommand()->batchInsert('tbl_user', ['name', 'age'], [
|
||||
* ['Tom', 30],
|
||||
* ['Jane', 20],
|
||||
* ['Linda', 25],
|
||||
* ])->execute();
|
||||
* ~~~
|
||||
*
|
||||
* Note that the values in each row must match the corresponding column names.
|
||||
*
|
||||
* @param string $table the table that new rows will be inserted into.
|
||||
* @param array $columns the column names
|
||||
* @param array $rows the rows to be batch inserted into the table
|
||||
* @return string the batch INSERT SQL statement
|
||||
*/
|
||||
public function batchInsert($table, $columns, $rows)
|
||||
{
|
||||
if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
|
||||
$columnSchemas = $tableSchema->columns;
|
||||
} else {
|
||||
$columnSchemas = [];
|
||||
}
|
||||
|
||||
foreach ($columns as $i => $name) {
|
||||
$columns[$i] = $this->db->quoteColumnName($name);
|
||||
}
|
||||
|
||||
$values = [];
|
||||
foreach ($rows as $row) {
|
||||
$vs = [];
|
||||
foreach ($row as $i => $value) {
|
||||
if (!is_array($value) && isset($columnSchemas[$columns[$i]])) {
|
||||
$value = $columnSchemas[$columns[$i]]->typecast($value);
|
||||
}
|
||||
$vs[] = is_string($value) ? $this->db->quoteValue($value) : $value;
|
||||
}
|
||||
$values[] = implode(', ', $vs);
|
||||
}
|
||||
|
||||
return 'INSERT INTO ' . $this->db->quoteTableName($table)
|
||||
. ' (' . implode(', ', $columns) . ') SELECT ' . implode(' UNION ALL ', $values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a SQL statement for resetting the sequence value of a table's primary key.
|
||||
* The sequence will be reset such that the primary key of the next new row inserted
|
||||
|
||||
Reference in New Issue
Block a user