mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-03 13:58:55 +08:00
...
This commit is contained in:
@ -18,6 +18,24 @@ namespace yii\db\dao;
|
||||
*/
|
||||
class ColumnSchema extends \yii\base\Component
|
||||
{
|
||||
/**
|
||||
* The followings are supported abstract column data types.
|
||||
*/
|
||||
const TYPE_STRING = 'string';
|
||||
const TYPE_TEXT = 'text';
|
||||
const TYPE_SMALLINT = 'smallint';
|
||||
const TYPE_INTEGER = 'integer';
|
||||
const TYPE_BIGINT = 'bigint';
|
||||
const TYPE_FLOAT = 'float';
|
||||
const TYPE_DECIMAL = 'decimal';
|
||||
const TYPE_DATETIME = 'datetime';
|
||||
const TYPE_TIMESTAMP = 'timestamp';
|
||||
const TYPE_TIME = 'time';
|
||||
const TYPE_DATE = 'date';
|
||||
const TYPE_BINARY = 'binary';
|
||||
const TYPE_BOOLEAN = 'boolean';
|
||||
const TYPE_MONEY = 'money';
|
||||
|
||||
/**
|
||||
* @var string name of this column (without quotes).
|
||||
*/
|
||||
|
||||
@ -15,6 +15,9 @@ use yii\db\Exception;
|
||||
/**
|
||||
* QueryBuilder builds a SQL statement based on the specification given as a [[Query]] object.
|
||||
*
|
||||
* QueryBuilder is often used behind the scenes by [[Query]] to build a DBMS-dependent SQL statement
|
||||
* from a [[Query]] object.
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
@ -22,7 +25,8 @@ class QueryBuilder extends \yii\base\Object
|
||||
{
|
||||
/**
|
||||
* @var array the abstract column types mapped to physical column types.
|
||||
* Child classes should override this property to declare possible type mappings.
|
||||
* This is mainly used to support creating/modifying tables using DB-independent data type specifications.
|
||||
* Child classes should override this property to declare supported type mappings.
|
||||
*/
|
||||
public $typeMap = array();
|
||||
/**
|
||||
@ -45,12 +49,12 @@ class QueryBuilder extends \yii\base\Object
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param Schema $schema the database schema information
|
||||
* @param Connection $connection the database connection.
|
||||
*/
|
||||
public function __construct($schema)
|
||||
public function __construct($connection)
|
||||
{
|
||||
$this->connection = $schema->connection;
|
||||
$this->schema = $schema;
|
||||
$this->connection = $connection;
|
||||
$this->schema = $connection->getSchema();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -182,7 +186,7 @@ class QueryBuilder extends \yii\base\Object
|
||||
* The columns in the new table should be specified as name-definition pairs (e.g. 'name'=>'string'),
|
||||
* where name stands for a column name which will be properly quoted by the method, and definition
|
||||
* stands for the column type which can contain an abstract DB type.
|
||||
* The {@link getColumnType} method will be invoked to convert any abstract type into a physical one.
|
||||
* The [[getColumnType()]] method will be invoked to convert any abstract type into a physical one.
|
||||
*
|
||||
* If a column is specified with definition only (e.g. 'PRIMARY KEY (name, type)'), it will be directly
|
||||
* inserted into the generated SQL.
|
||||
@ -242,7 +246,7 @@ class QueryBuilder extends \yii\base\Object
|
||||
* Builds a SQL statement for adding a new DB column.
|
||||
* @param string $table the table that the new column will be added to. The table name will be properly quoted by the method.
|
||||
* @param string $column the name of the new column. The name will be properly quoted by the method.
|
||||
* @param string $type the column type. The {@link getColumnType} method will be invoked to convert abstract column type (if any)
|
||||
* @param string $type the column type. The [[getColumnType()]] method will be invoked to convert abstract column type (if any)
|
||||
* into the physical one. Anything that is not recognized as abstract type will be kept in the generated SQL.
|
||||
* For example, 'string' will be turned into 'varchar(255)', while 'string not null' will become 'varchar(255) not null'.
|
||||
* @return string the SQL statement for adding a new column.
|
||||
@ -284,7 +288,7 @@ class QueryBuilder extends \yii\base\Object
|
||||
* Builds a SQL statement for changing the definition of a column.
|
||||
* @param string $table the table whose column is to be changed. The table name will be properly quoted by the method.
|
||||
* @param string $column the name of the column to be changed. The name will be properly quoted by the method.
|
||||
* @param string $type the new column type. The {@link getColumnType} method will be invoked to convert abstract column type (if any)
|
||||
* @param string $type the new column type. The [[getColumnType]] method will be invoked to convert abstract column type (if any)
|
||||
* into the physical one. Anything that is not recognized as abstract type will be kept in the generated SQL.
|
||||
* For example, 'string' will be turned into 'varchar(255)', while 'string not null' will become 'varchar(255) not null'.
|
||||
* @return string the SQL statement for changing the definition of a column.
|
||||
@ -406,7 +410,7 @@ class QueryBuilder extends \yii\base\Object
|
||||
|
||||
/**
|
||||
* Converts an abstract column type into a physical column type.
|
||||
* The conversion is done using the type map specified in {@link typeMap}.
|
||||
* The conversion is done using the type map specified in [[typeMap]].
|
||||
* These abstract column types are supported (using MySQL as example to explain the corresponding
|
||||
* physical types):
|
||||
* <ul>
|
||||
|
||||
@ -26,22 +26,6 @@ use yii\db\Exception;
|
||||
*/
|
||||
abstract class Schema extends \yii\base\Object
|
||||
{
|
||||
const TYPE_PK = 'pk';
|
||||
const TYPE_STRING = 'string';
|
||||
const TYPE_TEXT = 'text';
|
||||
const TYPE_SMALLINT = 'smallint';
|
||||
const TYPE_INTEGER = 'integer';
|
||||
const TYPE_BIGINT = 'bigint';
|
||||
const TYPE_FLOAT = 'float';
|
||||
const TYPE_DECIMAL = 'decimal';
|
||||
const TYPE_DATETIME = 'datetime';
|
||||
const TYPE_TIMESTAMP = 'timestamp';
|
||||
const TYPE_TIME = 'time';
|
||||
const TYPE_DATE = 'date';
|
||||
const TYPE_BINARY = 'binary';
|
||||
const TYPE_BOOLEAN = 'boolean';
|
||||
const TYPE_MONEY = 'money';
|
||||
|
||||
/**
|
||||
* @var Connection the database connection
|
||||
*/
|
||||
@ -148,11 +132,13 @@ abstract class Schema extends \yii\base\Object
|
||||
* Returns all table names in the database.
|
||||
* @param string $schema the schema of the tables. Defaults to empty string, meaning the current or default schema.
|
||||
* If not empty, the returned table names will be prefixed with the schema name.
|
||||
* @param boolean $refresh whether to fetch the latest available table names. If this is false,
|
||||
* table names fetched previously (if available) will be returned.
|
||||
* @return array all table names in the database.
|
||||
*/
|
||||
public function getTableNames($schema = '')
|
||||
public function getTableNames($schema = '', $refresh = false)
|
||||
{
|
||||
if (!isset($this->_tableNames[$schema])) {
|
||||
if (!isset($this->_tableNames[$schema]) || $refresh) {
|
||||
$this->_tableNames[$schema] = $this->findTableNames($schema);
|
||||
}
|
||||
return $this->_tableNames[$schema];
|
||||
@ -171,19 +157,25 @@ abstract class Schema extends \yii\base\Object
|
||||
|
||||
/**
|
||||
* Refreshes the schema.
|
||||
* This method resets the loaded table metadata and command builder
|
||||
* so that they can be recreated to reflect the change of schema.
|
||||
* This method cleans up the cached table schema and names
|
||||
* so that they can be recreated to reflect the database schema change.
|
||||
* @param string $tableName the name of the table that needs to be refreshed.
|
||||
* If null, all currently loaded tables will be refreshed.
|
||||
*/
|
||||
public function refresh()
|
||||
public function refresh($tableName = null)
|
||||
{
|
||||
$db = $this->connection;
|
||||
if ($db->schemaCachingDuration >= 0 && ($cache = \Yii::$application->getComponent($db->schemaCacheID)) !== null) {
|
||||
foreach ($this->_tables as $name => $table) {
|
||||
$cache->delete($this->getCacheKey($name));
|
||||
if ($tableName === null) {
|
||||
foreach ($this->_tables as $name => $table) {
|
||||
$cache->delete($this->getCacheKey($name));
|
||||
}
|
||||
$this->_tables = array();
|
||||
} else {
|
||||
$cache->delete($this->getCacheKey($tableName));
|
||||
unset($this->_tables[$tableName]);
|
||||
}
|
||||
}
|
||||
$this->_tables = array();
|
||||
$this->_tableNames = array();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -253,7 +245,7 @@ abstract class Schema extends \yii\base\Object
|
||||
*/
|
||||
public function createQueryBuilder()
|
||||
{
|
||||
return new QueryBuilder($this);
|
||||
return new QueryBuilder($this->connection);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -25,35 +25,35 @@ class ColumnSchema extends \yii\db\dao\ColumnSchema
|
||||
public function initTypes($dbType)
|
||||
{
|
||||
static $typeMap = array( // dbType => type
|
||||
'tinyint' => 'smallint',
|
||||
'bit' => 'smallint',
|
||||
'smallint' => 'smallint',
|
||||
'mediumint' => 'integer',
|
||||
'int' => 'integer',
|
||||
'integer' => 'integer',
|
||||
'bigint' => 'bigint',
|
||||
'float' => 'float',
|
||||
'double' => 'float',
|
||||
'real' => 'float',
|
||||
'decimal' => 'decimal',
|
||||
'numeric' => 'decimal',
|
||||
'tinytext' => 'text',
|
||||
'mediumtext' => 'text',
|
||||
'longtext' => 'text',
|
||||
'text' => 'text',
|
||||
'varchar' => 'string',
|
||||
'string' => 'string',
|
||||
'char' => 'string',
|
||||
'datetime' => 'datetime',
|
||||
'year' => 'date',
|
||||
'date' => 'date',
|
||||
'time' => 'time',
|
||||
'timestamp' => 'timestamp',
|
||||
'enum' => 'enum',
|
||||
'tinyint' => self::TYPE_SMALLINT,
|
||||
'bit' => self::TYPE_SMALLINT,
|
||||
'smallint' => self::TYPE_SMALLINT,
|
||||
'mediumint' => self::TYPE_INTEGER,
|
||||
'int' => self::TYPE_INTEGER,
|
||||
'integer' => self::TYPE_INTEGER,
|
||||
'bigint' => self::TYPE_BIGINT,
|
||||
'float' => self::TYPE_FLOAT,
|
||||
'double' => self::TYPE_FLOAT,
|
||||
'real' => self::TYPE_FLOAT,
|
||||
'decimal' => self::TYPE_DECIMAL,
|
||||
'numeric' => self::TYPE_DECIMAL,
|
||||
'tinytext' => self::TYPE_TEXT,
|
||||
'mediumtext' => self::TYPE_TEXT,
|
||||
'longtext' => self::TYPE_TEXT,
|
||||
'text' => self::TYPE_TEXT,
|
||||
'varchar' => self::TYPE_STRING,
|
||||
'string' => self::TYPE_STRING,
|
||||
'char' => self::TYPE_STRING,
|
||||
'datetime' => self::TYPE_DATETIME,
|
||||
'year' => self::TYPE_DATE,
|
||||
'date' => self::TYPE_DATE,
|
||||
'time' => self::TYPE_TIME,
|
||||
'timestamp' => self::TYPE_TIMESTAMP,
|
||||
'enum' => self::TYPE_STRING,
|
||||
);
|
||||
|
||||
$this->dbType = $dbType;
|
||||
$this->type = 'string';
|
||||
$this->type = self::TYPE_STRING;
|
||||
$this->unsigned = strpos($this->dbType, 'unsigned') !== false;
|
||||
|
||||
if (preg_match('/^(\w+)(?:\(([^\)]+)\))?/', $this->dbType, $matches)) {
|
||||
@ -63,7 +63,7 @@ class ColumnSchema extends \yii\db\dao\ColumnSchema
|
||||
}
|
||||
|
||||
if (!empty($matches[2])) {
|
||||
if ($this->type === 'enum') {
|
||||
if ($type === 'enum') {
|
||||
$values = explode(',', $matches[2]);
|
||||
foreach ($values as $i => $value) {
|
||||
$values[$i] = trim($value, "'");
|
||||
@ -93,7 +93,7 @@ class ColumnSchema extends \yii\db\dao\ColumnSchema
|
||||
|
||||
/**
|
||||
* Extracts the default value for the column.
|
||||
* The value is typecasted to correct PHP type.
|
||||
* The value is typecast to correct PHP type.
|
||||
* @param mixed $defaultValue the default value obtained from metadata
|
||||
*/
|
||||
public function initDefaultValue($defaultValue)
|
||||
|
||||
@ -22,21 +22,21 @@ class QueryBuilder extends \yii\db\dao\QueryBuilder
|
||||
* @var array the abstract column types mapped to physical column types.
|
||||
*/
|
||||
public $typeMap = array(
|
||||
Schema::TYPE_PK => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
|
||||
Schema::TYPE_STRING => 'varchar(255)',
|
||||
Schema::TYPE_TEXT => 'text',
|
||||
Schema::TYPE_SMALLINT => 'smallint(6)',
|
||||
Schema::TYPE_INTEGER => 'int(11)',
|
||||
Schema::TYPE_BIGINT => 'bigint(20)',
|
||||
Schema::TYPE_FLOAT => 'float',
|
||||
Schema::TYPE_DECIMAL => 'decimal',
|
||||
Schema::TYPE_DATETIME => 'datetime',
|
||||
Schema::TYPE_TIMESTAMP => 'timestamp',
|
||||
Schema::TYPE_TIME => 'time',
|
||||
Schema::TYPE_DATE => 'date',
|
||||
Schema::TYPE_BINARY => 'blob',
|
||||
Schema::TYPE_BOOLEAN => 'tinyint(1)',
|
||||
Schema::TYPE_MONEY => 'decimal(19,4)',
|
||||
'pk' => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
|
||||
ColumnSchema::TYPE_STRING => 'varchar(255)',
|
||||
ColumnSchema::TYPE_TEXT => 'text',
|
||||
ColumnSchema::TYPE_SMALLINT => 'smallint(6)',
|
||||
ColumnSchema::TYPE_INTEGER => 'int(11)',
|
||||
ColumnSchema::TYPE_BIGINT => 'bigint(20)',
|
||||
ColumnSchema::TYPE_FLOAT => 'float',
|
||||
ColumnSchema::TYPE_DECIMAL => 'decimal',
|
||||
ColumnSchema::TYPE_DATETIME => 'datetime',
|
||||
ColumnSchema::TYPE_TIMESTAMP => 'timestamp',
|
||||
ColumnSchema::TYPE_TIME => 'time',
|
||||
ColumnSchema::TYPE_DATE => 'date',
|
||||
ColumnSchema::TYPE_BINARY => 'blob',
|
||||
ColumnSchema::TYPE_BOOLEAN => 'tinyint(1)',
|
||||
ColumnSchema::TYPE_MONEY => 'decimal(19,4)',
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user