|
|
|
@ -42,6 +42,53 @@ class QueryBuilder extends \yii\db\QueryBuilder
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 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 |
|
|
|
|
* will have the specified value or 1. |
|
|
|
|