Browse Source

w

tags/2.0.0-beta
Qiang Xue 13 years ago
parent
commit
6980dc55b2
  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. * @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', 'pk' => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
'string' => 'varchar(255)', 'string' => 'varchar(255)',
'text' => 'text', 'text' => 'text',
@ -379,7 +379,7 @@ class QueryBuilder extends \yii\base\Component
/** /**
* Converts an abstract column type into a physical column type. * 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 * These abstract column types are supported (using MySQL as example to explain the corresponding
* physical types): * physical types):
* <ul> * <ul>
@ -405,12 +405,12 @@ class QueryBuilder extends \yii\base\Component
*/ */
public function getColumnType($type) public function getColumnType($type)
{ {
if (isset($this->columnTypes[$type])) { if (isset($this->typeMap[$type])) {
return $this->columnTypes[$type]; return $this->typeMap[$type];
} }
elseif (($pos = strpos($type, ' ')) !== false) { elseif (($pos = strpos($type, ' ')) !== false) {
$t = substr($type, 0, $pos); $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 { else {
return $type; 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) public function renameColumn($table, $name, $newName)
{ {
$db = $this->getDbConnection(); $quotedTable = $this->schema->quoteTableName($table);
$row = $db->createCommand('SHOW CREATE TABLE ' . $db->quoteTableName($table))->queryRow(); $row = $this->connection->createCommand('SHOW CREATE TABLE ' . $quotedTable)->queryRow();
if ($row === false) if ($row === false)
throw new CDbException(Yii::t('yii', 'Unable to find "{column}" in table "{table}".', array('{column}' => $name, '{table}' => $table))); 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']; $sql = $row['Create Table'];
else }
{ else {
$row = array_values($row); $row = array_values($row);
$sql = $row[1]; $sql = $row[1];
} }
if (preg_match_all('/^\s*`(.*?)`\s+(.*?),?$/m', $sql, $matches)) if (preg_match_all('/^\s*`(.*?)`\s+(.*?),?$/m', $sql, $matches)) {
{ foreach ($matches[1] as $i => $c) {
foreach ($matches[1] as $i => $c) if ($c === $name) {
{ return "ALTER TABLE $quotedTable CHANGE " . $this->schema->quoteColumnName($name)
if ($c === $name) . ' ' . $this->schema->quoteColumnName($newName) . ' ' . $matches[2][$i];
{
return "ALTER TABLE " . $db->quoteTableName($table)
. " CHANGE " . $db->quoteColumnName($name)
. ' ' . $db->quoteColumnName($newName) . ' ' . $matches[2][$i];
} }
} }
} }
// try to give back a SQL anyway // try to give back a SQL anyway
return "ALTER TABLE " . $db->quoteTableName($table) return "ALTER TABLE $quotedTable CHANGE " . $this->schema->quoteColumnName($name) . ' ' . $newName;
. " CHANGE " . $db->quoteColumnName($name) . ' ' . $newName;
} }
/** /**
@ -87,7 +81,7 @@ class QueryBuilder extends \yii\db\dao\QueryBuilder
*/ */
public function dropForeignKey($name, $table) public function dropForeignKey($name, $table)
{ {
return 'ALTER TABLE ' . $this->quoteTableName($table) return 'ALTER TABLE ' . $this->schema->quoteTableName($table)
. ' DROP FOREIGN KEY ' . $this->quoteColumnName($name); . ' DROP FOREIGN KEY ' . $this->schema->quoteColumnName($name);
} }
} }

Loading…
Cancel
Save