Browse Source

Added typecasting for SQL insertion and update.

tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
20bde29f58
  1. 3
      framework/yii/db/ColumnSchema.php
  2. 15
      framework/yii/db/QueryBuilder.php
  3. 11
      framework/yii/db/mysql/QueryBuilder.php

3
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) { if ($value === null || gettype($value) === $this->phpType || $value instanceof Expression) {
return $value; return $value;
} }
if ($value === '' && $this->type !== Schema::TYPE_TEXT && $this->type !== Schema::TYPE_STRING) {
return null;
}
switch ($this->phpType) { switch ($this->phpType) {
case 'string': case 'string':
return (string)$value; return (string)$value;

15
framework/yii/db/QueryBuilder.php

@ -94,6 +94,11 @@ class QueryBuilder extends \yii\base\Object
*/ */
public function insert($table, $columns, &$params) public function insert($table, $columns, &$params)
{ {
if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
$columnSchemas = $tableSchema->columns;
} else {
$columnSchemas = array();
}
$names = array(); $names = array();
$placeholders = array(); $placeholders = array();
foreach ($columns as $name => $value) { foreach ($columns as $name => $value) {
@ -106,7 +111,7 @@ class QueryBuilder extends \yii\base\Object
} else { } else {
$phName = self::PARAM_PREFIX . count($params); $phName = self::PARAM_PREFIX . count($params);
$placeholders[] = $phName; $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) public function update($table, $columns, $condition, &$params)
{ {
if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
$columnSchemas = $tableSchema->columns;
} else {
$columnSchemas = array();
}
$lines = array(); $lines = array();
foreach ($columns as $name => $value) { foreach ($columns as $name => $value) {
if ($value instanceof Expression) { if ($value instanceof Expression) {
@ -174,7 +185,7 @@ class QueryBuilder extends \yii\base\Object
} else { } else {
$phName = self::PARAM_PREFIX . count($params); $phName = self::PARAM_PREFIX . count($params);
$lines[] = $this->db->quoteColumnName($name) . '=' . $phName; $lines[] = $this->db->quoteColumnName($name) . '=' . $phName;
$params[$phName] = $value; $params[$phName] = isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecast($value) : $value;
} }
} }

11
framework/yii/db/mysql/QueryBuilder.php

@ -161,6 +161,12 @@ class QueryBuilder extends \yii\db\QueryBuilder
*/ */
public function batchInsert($table, $columns, $rows) public function batchInsert($table, $columns, $rows)
{ {
if (($tableSchema = $this->db->getTableSchema($table)) !== null) {
$columnSchemas = $tableSchema->columns;
} else {
$columnSchemas = array();
}
foreach ($columns as $i => $name) { foreach ($columns as $i => $name) {
$columns[$i] = $this->db->quoteColumnName($name); $columns[$i] = $this->db->quoteColumnName($name);
} }
@ -168,7 +174,10 @@ class QueryBuilder extends \yii\db\QueryBuilder
$values = array(); $values = array();
foreach ($rows as $row) { foreach ($rows as $row) {
$vs = array(); $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; $vs[] = is_string($value) ? $this->db->quoteValue($value) : $value;
} }
$values[] = '(' . implode(', ', $vs) . ')'; $values[] = '(' . implode(', ', $vs) . ')';

Loading…
Cancel
Save