Browse Source

w

tags/2.0.0-beta
Qiang Xue 13 years ago
parent
commit
7f705e915f
  1. 10
      framework/db/dao/QueryBuilder.php
  2. 32
      framework/db/dao/mysql/QueryBuilder.php

10
framework/db/dao/QueryBuilder.php

@ -21,7 +21,7 @@ class QueryBuilder extends \yii\base\Component
/**
* @var array the abstract column types mapped to physical column types.
*/
public $columnTypes = array(
public $typeMap = array(
'pk' => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
'string' => 'varchar(255)',
'text' => 'text',
@ -379,7 +379,7 @@ class QueryBuilder extends \yii\base\Component
/**
* Converts an abstract column type into a physical column type.
* The conversion is done using the type map specified in {@link columnTypes}.
* The conversion is done using the type map specified in {@link typeMap}.
* These abstract column types are supported (using MySQL as example to explain the corresponding
* physical types):
* <ul>
@ -405,12 +405,12 @@ class QueryBuilder extends \yii\base\Component
*/
public function getColumnType($type)
{
if (isset($this->columnTypes[$type])) {
return $this->columnTypes[$type];
if (isset($this->typeMap[$type])) {
return $this->typeMap[$type];
}
elseif (($pos = strpos($type, ' ')) !== false) {
$t = substr($type, 0, $pos);
return (isset($this->columnTypes[$t]) ? $this->columnTypes[$t] : $t) . substr($type, $pos);
return (isset($this->typeMap[$t]) ? $this->typeMap[$t] : $t) . substr($type, $pos);
}
else {
return $type;

32
framework/db/dao/mysql/QueryBuilder.php

@ -49,33 +49,27 @@ class QueryBuilder extends \yii\db\dao\QueryBuilder
*/
public function renameColumn($table, $name, $newName)
{
$db = $this->getDbConnection();
$row = $db->createCommand('SHOW CREATE TABLE ' . $db->quoteTableName($table))->queryRow();
$quotedTable = $this->schema->quoteTableName($table);
$row = $this->connection->createCommand('SHOW CREATE TABLE ' . $quotedTable)->queryRow();
if ($row === false)
throw new CDbException(Yii::t('yii', 'Unable to find "{column}" in table "{table}".', array('{column}' => $name, '{table}' => $table)));
if (isset($row['Create Table']))
if (isset($row['Create Table'])) {
$sql = $row['Create Table'];
else
{
}
else {
$row = array_values($row);
$sql = $row[1];
}
if (preg_match_all('/^\s*`(.*?)`\s+(.*?),?$/m', $sql, $matches))
{
foreach ($matches[1] as $i => $c)
{
if ($c === $name)
{
return "ALTER TABLE " . $db->quoteTableName($table)
. " CHANGE " . $db->quoteColumnName($name)
. ' ' . $db->quoteColumnName($newName) . ' ' . $matches[2][$i];
if (preg_match_all('/^\s*`(.*?)`\s+(.*?),?$/m', $sql, $matches)) {
foreach ($matches[1] as $i => $c) {
if ($c === $name) {
return "ALTER TABLE $quotedTable CHANGE " . $this->schema->quoteColumnName($name)
. ' ' . $this->schema->quoteColumnName($newName) . ' ' . $matches[2][$i];
}
}
}
// try to give back a SQL anyway
return "ALTER TABLE " . $db->quoteTableName($table)
. " CHANGE " . $db->quoteColumnName($name) . ' ' . $newName;
return "ALTER TABLE $quotedTable CHANGE " . $this->schema->quoteColumnName($name) . ' ' . $newName;
}
/**
@ -87,7 +81,7 @@ class QueryBuilder extends \yii\db\dao\QueryBuilder
*/
public function dropForeignKey($name, $table)
{
return 'ALTER TABLE ' . $this->quoteTableName($table)
. ' DROP FOREIGN KEY ' . $this->quoteColumnName($name);
return 'ALTER TABLE ' . $this->schema->quoteTableName($table)
. ' DROP FOREIGN KEY ' . $this->schema->quoteColumnName($name);
}
}

Loading…
Cancel
Save