split typecast method into two

one method for fetching data and one for sending to db.

fixes #2287
This commit is contained in:
Carsten Brandt
2014-06-26 00:00:37 +02:00
parent 69fa11fd2d
commit 6a48f68955
15 changed files with 54 additions and 22 deletions

View File

@@ -124,6 +124,7 @@ Yii Framework 2 Change Log
- Enh: Improved `yii\helpers\Inflector::slug` to support more cases for Russian, Hebrew and special characters (samdark)
- Enh #3926: `yii\widgets\Breadcrumbs::$links`. Allows individual link to have its own `template` (creocoder, umneeq)
- Enh #4028: Added ability to `yii\widgets\Menu` to encode each item's label separately (creocoder, umneeq)
- Chg #2287: Split `yii\db\ColumnSchema::typecast()` into two methods `typecastToPhp()` and `typecastToDatabase()` to allow specifying PDO type explicitly (cebe)
- Chg #2898: `yii\console\controllers\AssetController` is now using hashes instead of timestamps (samdark)
- Chg #2913: RBAC `DbManager` is now initialized via migration (samdark)
- Chg #3036: Upgraded Twitter Bootstrap to 3.1.x (qiangxue)

View File

@@ -369,7 +369,7 @@ class ActiveRecord extends BaseActiveRecord
$columns = static::getTableSchema()->columns;
foreach ($row as $name => $value) {
if (isset($columns[$name])) {
$row[$name] = $columns[$name]->typecast($value);
$row[$name] = $columns[$name]->typecastToPhp($value);
}
}
parent::populateRecord($record, $row);
@@ -466,7 +466,7 @@ class ActiveRecord extends BaseActiveRecord
if ($table->sequenceName !== null) {
foreach ($table->primaryKey as $name) {
if ($this->getAttribute($name) === null) {
$id = $table->columns[$name]->typecast($db->getLastInsertID($table->sequenceName));
$id = $table->columns[$name]->typecastToPhp($db->getLastInsertID($table->sequenceName));
$this->setAttribute($name, $id);
$values[$name] = $id;
break;

View File

@@ -33,7 +33,7 @@ class ColumnSchema extends Object
public $type;
/**
* @var string the PHP type of this column. Possible PHP types include:
* string, boolean, integer, double.
* `string`, `boolean`, `integer`, `double`.
*/
public $phpType;
/**
@@ -79,12 +79,12 @@ class ColumnSchema extends Object
public $comment;
/**
* Converts the input value according to [[phpType]].
* Converts the input value according to [[phpType]] after retrieval from the database.
* If the value is null or an [[Expression]], it will not be converted.
* @param mixed $value input value
* @return mixed converted value
*/
public function typecast($value)
public function typecastToPhp($value)
{
if ($value === '' && $this->type !== Schema::TYPE_TEXT && $this->type !== Schema::TYPE_STRING && $this->type !== Schema::TYPE_BINARY) {
return null;
@@ -105,4 +105,18 @@ class ColumnSchema extends Object
return $value;
}
/**
* Converts the input value according to [[type]] and [[dbType]] for use in a db query.
* If the value is null or an [[Expression]], it will not be converted.
* @param mixed $value input value
* @return mixed converted value. This may also be an array containing the value as the first element
* and the PDO type as the second element.
*/
public function typecastToDatabase($value)
{
// the default implementation does the same as casting for PHP but it should be possible
// to override this with annotation of explicit PDO type.
return $this->typecastToPhp($value);
}
}

View File

@@ -147,7 +147,7 @@ class QueryBuilder extends \yii\base\Object
} else {
$phName = self::PARAM_PREFIX . count($params);
$placeholders[] = $phName;
$params[$phName] = !is_array($value) && isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecast($value) : $value;
$params[$phName] = !is_array($value) && isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecastToDatabase($value) : $value;
}
}
@@ -188,7 +188,7 @@ class QueryBuilder extends \yii\base\Object
$vs = [];
foreach ($row as $i => $value) {
if (!is_array($value) && isset($columnSchemas[$columns[$i]])) {
$value = $columnSchemas[$columns[$i]]->typecast($value);
$value = $columnSchemas[$columns[$i]]->typecastToDatabase($value);
}
if (is_string($value)) {
$value = $this->db->quoteValue($value);
@@ -247,7 +247,7 @@ class QueryBuilder extends \yii\base\Object
} else {
$phName = self::PARAM_PREFIX . count($params);
$lines[] = $this->db->quoteColumnName($name) . '=' . $phName;
$params[$phName] = !is_array($value) && isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecast($value) : $value;
$params[$phName] = !is_array($value) && isset($columnSchemas[$name]) ? $columnSchemas[$name]->typecastToDatabase($value) : $value;
}
}

View File

@@ -251,7 +251,7 @@ class Schema extends \yii\db\Schema
} elseif (isset($type) && $type === 'bit') {
$column->defaultValue = hexdec(trim($info['Default'],'X\''));
} else {
$column->defaultValue = $column->typecast($info['Default']);
$column->defaultValue = $column->typecastToPhp($info['Default']);
}
return $column;

View File

@@ -222,7 +222,7 @@ class Schema extends \yii\db\Schema
$info['column_default'] = null;
}
if (!$column->isPrimaryKey && ($column->type !== 'timestamp' || $info['column_default'] !== 'CURRENT_TIMESTAMP')) {
$column->defaultValue = $column->typecast($info['column_default']);
$column->defaultValue = $column->typecastToPhp($info['column_default']);
}
return $column;

View File

@@ -177,7 +177,7 @@ class Schema extends \yii\db\Schema
} elseif (isset($type) && $type === 'bit') {
$column->defaultValue = bindec(trim($info['Default'],'b\''));
} else {
$column->defaultValue = $column->typecast($info['Default']);
$column->defaultValue = $column->typecastToPhp($info['Default']);
}
}

View File

@@ -174,7 +174,7 @@ EOD;
if (stripos($column['DATA_DEFAULT'], 'timestamp') !== false) {
$c->defaultValue = null;
} else {
$c->defaultValue = $c->typecast($column['DATA_DEFAULT']);
$c->defaultValue = $c->typecastToPhp($column['DATA_DEFAULT']);
}
}

View File

@@ -416,9 +416,9 @@ SQL;
} elseif (preg_match("/^'(.*?)'::/", $column->defaultValue, $matches)) {
$column->defaultValue = $matches[1];
} elseif (preg_match("/^(.*?)::/", $column->defaultValue, $matches)) {
$column->defaultValue = $column->typecast($matches[1]);
$column->defaultValue = $column->typecastToPhp($matches[1]);
} else {
$column->defaultValue = $column->typecast($column->defaultValue);
$column->defaultValue = $column->typecastToPhp($column->defaultValue);
}
}
}

View File

@@ -80,7 +80,7 @@ class QueryBuilder extends \yii\db\QueryBuilder
$vs = [];
foreach ($row as $i => $value) {
if (!is_array($value) && isset($columnSchemas[$columns[$i]])) {
$value = $columnSchemas[$columns[$i]]->typecast($value);
$value = $columnSchemas[$columns[$i]]->typecastToDatabase($value);
}
if (is_string($value)) {
$value = $this->db->quoteValue($value);

View File

@@ -251,7 +251,7 @@ class Schema extends \yii\db\Schema
$column->defaultValue = new Expression('CURRENT_TIMESTAMP');
} else {
$value = trim($info['dflt_value'], "'\"");
$column->defaultValue = $column->typecast($value);
$column->defaultValue = $column->typecastToPhp($value);
}
}