From 20bde29f58472416d2a071fc8c28bad935be7300 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Mon, 22 Jul 2013 10:47:22 -0400 Subject: [PATCH] Added typecasting for SQL insertion and update. --- framework/yii/db/ColumnSchema.php | 3 +++ framework/yii/db/QueryBuilder.php | 15 +++++++++++++-- framework/yii/db/mysql/QueryBuilder.php | 11 ++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/framework/yii/db/ColumnSchema.php b/framework/yii/db/ColumnSchema.php index ffdafd4..83453e4 100644 --- a/framework/yii/db/ColumnSchema.php +++ b/framework/yii/db/ColumnSchema.php @@ -88,6 +88,9 @@ class ColumnSchema extends \yii\base\Component if ($value === null || gettype($value) === $this->phpType || $value instanceof Expression) { return $value; } + if ($value === '' && $this->type !== Schema::TYPE_TEXT && $this->type !== Schema::TYPE_STRING) { + return null; + } switch ($this->phpType) { case 'string': return (string)$value; diff --git a/framework/yii/db/QueryBuilder.php b/framework/yii/db/QueryBuilder.php index 67a8dc3..09d7624 100644 --- a/framework/yii/db/QueryBuilder.php +++ b/framework/yii/db/QueryBuilder.php @@ -94,6 +94,11 @@ class QueryBuilder extends \yii\base\Object */ public function insert($table, $columns, &$params) { + if (($tableSchema = $this->db->getTableSchema($table)) !== null) { + $columnSchemas = $tableSchema->columns; + } else { + $columnSchemas = array(); + } $names = array(); $placeholders = array(); foreach ($columns as $name => $value) { @@ -106,7 +111,7 @@ class QueryBuilder extends \yii\base\Object } else { $phName = self::PARAM_PREFIX . count($params); $placeholders[] = $phName; - $params[$phName] = $value; + $params[$phName] = isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecast($value) : $value; } } @@ -164,6 +169,12 @@ class QueryBuilder extends \yii\base\Object */ public function update($table, $columns, $condition, &$params) { + if (($tableSchema = $this->db->getTableSchema($table)) !== null) { + $columnSchemas = $tableSchema->columns; + } else { + $columnSchemas = array(); + } + $lines = array(); foreach ($columns as $name => $value) { if ($value instanceof Expression) { @@ -174,7 +185,7 @@ class QueryBuilder extends \yii\base\Object } else { $phName = self::PARAM_PREFIX . count($params); $lines[] = $this->db->quoteColumnName($name) . '=' . $phName; - $params[$phName] = $value; + $params[$phName] = isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecast($value) : $value; } } diff --git a/framework/yii/db/mysql/QueryBuilder.php b/framework/yii/db/mysql/QueryBuilder.php index ae6949a..a39d124 100644 --- a/framework/yii/db/mysql/QueryBuilder.php +++ b/framework/yii/db/mysql/QueryBuilder.php @@ -161,6 +161,12 @@ class QueryBuilder extends \yii\db\QueryBuilder */ public function batchInsert($table, $columns, $rows) { + if (($tableSchema = $this->db->getTableSchema($table)) !== null) { + $columnSchemas = $tableSchema->columns; + } else { + $columnSchemas = array(); + } + foreach ($columns as $i => $name) { $columns[$i] = $this->db->quoteColumnName($name); } @@ -168,7 +174,10 @@ class QueryBuilder extends \yii\db\QueryBuilder $values = array(); foreach ($rows as $row) { $vs = array(); - foreach ($row as $value) { + foreach ($row as $i => $value) { + if (isset($columnSchemas[$columns[$i]])) { + $value = $columnSchemas[$columns[$i]]->typecast($value); + } $vs[] = is_string($value) ? $this->db->quoteValue($value) : $value; } $values[] = '(' . implode(', ', $vs) . ')';