fix issue with postgreSQL and batch inserting boolean values

fixes #4654
This commit is contained in:
Carsten Brandt
2014-08-12 01:42:08 +02:00
parent f1dd83e2a9
commit 92d65ab78b
4 changed files with 68 additions and 4 deletions

View File

@ -84,11 +84,13 @@ abstract class Schema extends Object
*/
private $_builder;
/**
* @return \yii\db\ColumnSchema
* @throws \yii\base\InvalidConfigException
*/
protected function createColumnSchema() {
protected function createColumnSchema()
{
return Yii::createObject('yii\db\ColumnSchema');
}

View File

@ -159,4 +159,44 @@ class QueryBuilder extends \yii\db\QueryBuilder
. $this->db->quoteColumnName($column) . ' TYPE '
. $this->getColumnType($type);
}
/**
* @inheritdoc
*/
public function batchInsert($table, $columns, $rows)
{
if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
$columnSchemas = $tableSchema->columns;
} else {
$columnSchemas = [];
}
$values = [];
foreach ($rows as $row) {
$vs = [];
foreach ($row as $i => $value) {
if (!is_array($value) && isset($columnSchemas[$columns[$i]])) {
$value = $columnSchemas[$columns[$i]]->dbTypecast($value);
}
if (is_string($value)) {
$value = $this->db->quoteValue($value);
} elseif ($value === true) {
$value = 'TRUE';
} elseif ($value === false) {
$value = 'FALSE';
} elseif ($value === null) {
$value = 'NULL';
}
$vs[] = $value;
}
$values[] = '(' . implode(', ', $vs) . ')';
}
foreach ($columns as $i => $name) {
$columns[$i] = $this->db->quoteColumnName($name);
}
return 'INSERT INTO ' . $this->db->quoteTableName($table)
. ' (' . implode(', ', $columns) . ') VALUES ' . implode(', ', $values);
}
}