类 yii\db\mssql\Schema
Schema 是用于从 MS SQL Server 数据库(版本 2008 及以上)中检索元数据的类。
公共属性
公共方法
受保护的方法
常量
常量 | 值 | 描述 | 定义于 |
---|---|---|---|
SCHEMA_CACHE_VERSION | 1 | 模式缓存版本,用于在缓存数据格式更改时检测缓存值中的不兼容性。 | yii\db\Schema |
TYPE_BIGINT | 'bigint' | yii\db\Schema | |
TYPE_BIGPK | 'bigpk' | yii\db\Schema | |
TYPE_BINARY | 'binary' | yii\db\Schema | |
TYPE_BOOLEAN | 'boolean' | yii\db\Schema | |
TYPE_CHAR | 'char' | yii\db\Schema | |
TYPE_DATE | 'date' | yii\db\Schema | |
TYPE_DATETIME | 'datetime' | yii\db\Schema | |
TYPE_DECIMAL | 'decimal' | yii\db\Schema | |
TYPE_DOUBLE | 'double' | yii\db\Schema | |
TYPE_FLOAT | 'float' | yii\db\Schema | |
TYPE_INTEGER | 'integer' | yii\db\Schema | |
TYPE_JSON | 'json' | yii\db\Schema | |
TYPE_MONEY | 'money' | yii\db\Schema | |
TYPE_PK | 'pk' | yii\db\Schema | |
TYPE_SMALLINT | 'smallint' | yii\db\Schema | |
TYPE_STRING | 'string' | yii\db\Schema | |
TYPE_TEXT | 'text' | yii\db\Schema | |
TYPE_TIME | 'time' | yii\db\Schema | |
TYPE_TIMESTAMP | 'timestamp' | yii\db\Schema | |
TYPE_TINYINT | 'tinyint' | yii\db\Schema | |
TYPE_UBIGPK | 'ubigpk' | yii\db\Schema | |
TYPE_UPK | 'upk' | yii\db\Schema |
属性详细信息
用于引用列名的字符。如果开始和结束字符不同,可以使用包含两个字符的数组。
列模式类或类配置
用于引用模式、表等名称的字符。如果开始和结束字符不同,可以使用包含两个字符的数组。
从物理列类型(键)到抽象列类型(值)的映射
'bigint' => self::TYPE_BIGINT,
'numeric' => self::TYPE_DECIMAL,
'bit' => self::TYPE_SMALLINT,
'smallint' => self::TYPE_SMALLINT,
'decimal' => self::TYPE_DECIMAL,
'smallmoney' => self::TYPE_MONEY,
'int' => self::TYPE_INTEGER,
'tinyint' => self::TYPE_TINYINT,
'money' => self::TYPE_MONEY,
'float' => self::TYPE_FLOAT,
'double' => self::TYPE_DOUBLE,
'real' => self::TYPE_FLOAT,
'date' => self::TYPE_DATE,
'datetimeoffset' => self::TYPE_DATETIME,
'datetime2' => self::TYPE_DATETIME,
'smalldatetime' => self::TYPE_DATETIME,
'datetime' => self::TYPE_DATETIME,
'time' => self::TYPE_TIME,
'char' => self::TYPE_CHAR,
'varchar' => self::TYPE_STRING,
'text' => self::TYPE_TEXT,
'nchar' => self::TYPE_CHAR,
'nvarchar' => self::TYPE_STRING,
'ntext' => self::TYPE_TEXT,
'binary' => self::TYPE_BINARY,
'varbinary' => self::TYPE_BINARY,
'image' => self::TYPE_BINARY,
'timestamp' => self::TYPE_TIMESTAMP,
'hierarchyid' => self::TYPE_STRING,
'uniqueidentifier' => self::TYPE_STRING,
'sql_variant' => self::TYPE_STRING,
'xml' => self::TYPE_STRING,
'table' => self::TYPE_STRING,
]
方法详情
public mixed __call ( $name, $params ) | ||
$name | string |
方法名称 |
$params | array |
方法参数 |
返回值 | mixed |
方法返回值 |
---|---|---|
抛出异常 | yii\base\UnknownMethodException |
调用未知方法时 |
public function __call($name, $params)
{
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
定义在: yii\base\BaseObject::__construct()
构造函数。
默认实现执行两件事
- 使用给定的配置
$config
初始化对象。 - 调用 init().
如果此方法在子类中被重写,建议
- 构造函数的最后一个参数是一个配置数组,就像这里的
$config
一样。 - 在构造函数的末尾调用父类的实现。
public void __construct ( $config = [] ) | ||
$config | array |
用于初始化对象属性的名称-值对 |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定义在: yii\base\BaseObject::__get()
返回对象属性的值。
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行$value = $object->property;
时会隐式调用。
另请参阅 __set().
public mixed __get ( $name ) | ||
$name | string |
属性名称 |
返回值 | mixed |
属性值 |
---|---|---|
抛出异常 | yii\base\UnknownPropertyException |
如果属性未定义 |
抛出异常 | yii\base\InvalidCallException |
如果属性是只写 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter();
} elseif (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定义在: yii\base\BaseObject::__isset()
检查属性是否已设置,即已定义且不为空。
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行isset($object->property)
时会隐式调用。
请注意,如果属性未定义,将返回false。
public boolean __isset ( $name ) | ||
$name | string |
属性名称或事件名称 |
返回值 | boolean |
命名的属性是否已设置(不为空)。 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
return false;
}
定义于: yii\base\BaseObject::__set()
设置对象属性的值。
不要直接调用此方法,因为它是一个 PHP 魔术方法,会在执行 $object->property = $value;
时隐式调用。
另见 __get().
public void __set ( $name, $value ) | ||
$name | string |
属性名称或事件名称 |
$value | mixed |
属性值 |
抛出异常 | yii\base\UnknownPropertyException |
如果属性未定义 |
---|---|---|
抛出异常 | yii\base\InvalidCallException |
如果属性是只读的 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
} else {
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
}
定义于: yii\base\BaseObject::__unset()
将对象属性设置为 null。
不要直接调用此方法,因为它是一个 PHP 魔术方法,会在执行 unset($object->property)
时隐式调用。
注意,如果属性未定义,此方法将不做任何操作。如果属性是只读的,它将抛出一个异常。
public void __unset ( $name ) | ||
$name | string |
属性名称 |
抛出异常 | yii\base\InvalidCallException |
如果属性是只读的。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
}
}
定义于: yii\base\BaseObject::canGetProperty()
返回一个值,指示是否可以读取属性。
如果一个属性是可读的,当
- 该类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称相同的成员变量(当
$checkVars
为 true 时);
另见 canSetProperty().
public boolean canGetProperty ( $name, $checkVars = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
返回值 | boolean |
属性是否可读 |
---|
public function canGetProperty($name, $checkVars = true)
{
return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}
定义于: yii\base\BaseObject::canSetProperty()
返回一个值,指示是否可以设置属性。
如果一个属性是可写的,当
- 该类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称相同的成员变量(当
$checkVars
为 true 时);
另见 canGetProperty().
public boolean canSetProperty ( $name, $checkVars = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
返回值 | boolean |
属性是否可写 |
---|
public function canSetProperty($name, $checkVars = true)
{
return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}
::class
代替。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名称。
public static string className ( ) | ||
返回值 | string |
此类的完全限定名。 |
---|
public static function className()
{
return get_called_class();
}
定义于: yii\db\Schema::convertException()
如果可能,将 DB 异常转换为更具体的异常。
public yii\db\Exception convertException ( Exception $e, $rawSql ) | ||
$e | 异常 | |
$rawSql | string |
产生异常的 SQL |
public function convertException(\Exception $e, $rawSql)
{
if ($e instanceof Exception) {
return $e;
}
$exceptionClass = '\yii\db\Exception';
foreach ($this->exceptionMap as $error => $class) {
if (strpos($e->getMessage(), $error) !== false) {
$exceptionClass = $class;
}
}
$message = $e->getMessage() . "\nThe SQL being executed was: $rawSql";
$errorInfo = $e instanceof \PDOException ? $e->errorInfo : null;
return new $exceptionClass($message, $errorInfo, $e->getCode(), $e);
}
protected yii\db\ColumnSchema createColumnSchema ( ) | ||
返回值 | yii\db\ColumnSchema |
列模式实例。 |
---|---|---|
抛出异常 | yii\base\InvalidConfigException |
如果无法创建列模式类。 |
protected function createColumnSchema()
{
return Yii::createObject($this->columnSchemaClass);
}
根据类型和值精度创建列模式构建器实例。
此方法可能被子类覆盖,以创建特定于 DBMS 的列模式构建器。
public yii\db\ColumnSchemaBuilder createColumnSchemaBuilder ( $type, $length = null ) | ||
$type | string |
列的类型。请参阅 yii\db\mssql\ColumnSchemaBuilder::$type. |
$length | integer|string|array|null |
列的长度或精度。请参阅 yii\db\mssql\ColumnSchemaBuilder::$length. |
返回值 | yii\db\ColumnSchemaBuilder |
列模式构建器实例 |
---|
public function createColumnSchemaBuilder($type, $length = null)
{
return Yii::createObject(ColumnSchemaBuilder::className(), [$type, $length, $this->db]);
}
为 MSSQL 数据库创建一个查询构建器。
public yii\db\mssql\QueryBuilder createQueryBuilder ( ) | ||
返回值 | yii\db\mssql\QueryBuilder |
查询构建器接口。 |
---|
public function createQueryBuilder()
{
return Yii::createObject(QueryBuilder::className(), [$this->db]);
}
创建一个新的保存点。
public void createSavepoint ( $name ) | ||
$name | string |
保存点名称 |
public function createSavepoint($name)
{
$this->db->createCommand("SAVE TRANSACTION $name")->execute();
}
收集表列的元数据。
protected boolean findColumns ( $table ) | ||
$table | yii\db\mssql\TableSchema |
表元数据 |
返回值 | boolean |
该表是否在数据库中存在 |
---|
protected function findColumns($table)
{
$columnsTableName = 'INFORMATION_SCHEMA.COLUMNS';
$whereSql = '[t1].[table_name] = ' . $this->db->quoteValue($table->name);
if ($table->catalogName !== null) {
$columnsTableName = "{$table->catalogName}.{$columnsTableName}";
$whereSql .= " AND [t1].[table_catalog] = '{$table->catalogName}'";
}
if ($table->schemaName !== null) {
$whereSql .= " AND [t1].[table_schema] = '{$table->schemaName}'";
}
$columnsTableName = $this->quoteTableName($columnsTableName);
$sql = <<<SQL
CT
].[column_name],
].[is_nullable],
E WHEN [t1].[data_type] IN ('char','varchar','nchar','nvarchar','binary','varbinary') THEN
CASE WHEN [t1].[character_maximum_length] = NULL OR [t1].[character_maximum_length] = -1 THEN
[t1].[data_type]
ELSE
[t1].[data_type] + '(' + LTRIM(RTRIM(CONVERT(CHAR,[t1].[character_maximum_length]))) + ')'
END
E
[t1].[data_type]
AS 'data_type',
].[column_default],
UMNPROPERTY(OBJECT_ID([t1].[table_schema] + '.' + [t1].[table_name]), [t1].[column_name], 'IsIdentity') AS is_identity,
UMNPROPERTY(OBJECT_ID([t1].[table_schema] + '.' + [t1].[table_name]), [t1].[column_name], 'IsComputed') AS is_computed,
SELECT CONVERT(VARCHAR, [t2].[value])
OM [sys].[extended_properties] AS [t2]
ERE
t2].[class] = 1 AND
t2].[class_desc] = 'OBJECT_OR_COLUMN' AND
t2].[name] = 'MS_Description' AND
t2].[major_id] = OBJECT_ID([t1].[TABLE_SCHEMA] + '.' + [t1].[table_name]) AND
t2].[minor_id] = COLUMNPROPERTY(OBJECT_ID([t1].[TABLE_SCHEMA] + '.' + [t1].[TABLE_NAME]), [t1].[COLUMN_NAME], 'ColumnID')
s comment
{$columnsTableName} AS [t1]
E {$whereSql}
try {
$columns = $this->db->createCommand($sql)->queryAll();
if (empty($columns)) {
return false;
}
} catch (\Exception $e) {
return false;
}
foreach ($columns as $column) {
$column = $this->loadColumnSchema($column);
foreach ($table->primaryKey as $primaryKey) {
if (strcasecmp($column->name, $primaryKey) === 0) {
$column->isPrimaryKey = true;
break;
}
}
if ($column->isPrimaryKey && $column->autoIncrement) {
$table->sequenceName = '';
}
$table->columns[$column->name] = $column;
}
return true;
}
收集给定表的外部键列详细信息。
protected void findForeignKeys ( $table ) | ||
$table | yii\db\mssql\TableSchema |
表元数据 |
protected function findForeignKeys($table)
{
$object = $table->name;
if ($table->schemaName !== null) {
$object = $table->schemaName . '.' . $object;
}
if ($table->catalogName !== null) {
$object = $table->catalogName . '.' . $object;
}
// please refer to the following page for more details:
// http://msdn2.microsoft.com/en-us/library/aa175805(SQL.80).aspx
$sql = <<<'SQL'
CT
].[name] AS [fk_name],
].[name] AS [fk_column_name],
ECT_NAME([fk].[referenced_object_id]) AS [uq_table_name],
].[name] AS [uq_column_name]
s].[foreign_keys] AS [fk]
ER JOIN [sys].[foreign_key_columns] AS [fkc] ON
k].[object_id] = [fkc].[constraint_object_id]
ER JOIN [sys].[columns] AS [cp] ON
k].[parent_object_id] = [cp].[object_id] AND
kc].[parent_column_id] = [cp].[column_id]
ER JOIN [sys].[columns] AS [cr] ON
k].[referenced_object_id] = [cr].[object_id] AND
kc].[referenced_column_id] = [cr].[column_id]
E
].[parent_object_id] = OBJECT_ID(:object)
$rows = $this->db->createCommand($sql, [
':object' => $object,
])->queryAll();
$table->foreignKeys = [];
foreach ($rows as $row) {
if (!isset($table->foreignKeys[$row['fk_name']])) {
$table->foreignKeys[$row['fk_name']][] = $row['uq_table_name'];
}
$table->foreignKeys[$row['fk_name']][$row['fk_column_name']] = $row['uq_column_name'];
}
}
收集给定表的主键列详细信息。
protected void findPrimaryKeys ( $table ) | ||
$table | yii\db\mssql\TableSchema |
表元数据 |
protected function findPrimaryKeys($table)
{
$result = [];
foreach ($this->findTableConstraints($table, 'PRIMARY KEY') as $row) {
$result[] = $row['field_name'];
}
$table->primaryKey = $result;
}
返回数据库中的所有模式名称,包括默认模式,但不包括系统模式。
此方法应由子类覆盖以支持此功能,因为默认实现只是抛出异常。
protected array findSchemaNames ( ) | ||
返回值 | array |
数据库中的所有模式名称,除了系统模式。 |
---|---|---|
抛出异常 | yii\base\NotSupportedException |
如果此方法不受 DBMS 支持。 |
protected function findSchemaNames()
{
static $sql = <<<'SQL'
CT [s].[name]
[sys].[schemas] AS [s]
R JOIN [sys].[database_principals] AS [p] ON [p].[principal_id] = [s].[principal_id]
E [p].[is_fixed_role] = 0 AND [p].[sid] IS NOT NULL
R BY [s].[name] ASC
return $this->db->createCommand($sql)->queryColumn();
}
收集给定表和约束类型的约束详细信息。
protected array findTableConstraints ( $table, $type ) | ||
$table | yii\db\mssql\TableSchema | |
$type | string |
PRIMARY KEY 或 UNIQUE 之一 |
返回值 | array |
每个条目包含 index_name 和 field_name |
---|
protected function findTableConstraints($table, $type)
{
$keyColumnUsageTableName = 'INFORMATION_SCHEMA.KEY_COLUMN_USAGE';
$tableConstraintsTableName = 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS';
if ($table->catalogName !== null) {
$keyColumnUsageTableName = $table->catalogName . '.' . $keyColumnUsageTableName;
$tableConstraintsTableName = $table->catalogName . '.' . $tableConstraintsTableName;
}
$keyColumnUsageTableName = $this->quoteTableName($keyColumnUsageTableName);
$tableConstraintsTableName = $this->quoteTableName($tableConstraintsTableName);
$sql = <<<SQL
CT
[kcu].[constraint_name] AS [index_name],
[kcu].[column_name] AS [field_name]
{$keyColumnUsageTableName} AS [kcu]
JOIN {$tableConstraintsTableName} AS [tc] ON
[kcu].[table_schema] = [tc].[table_schema] AND
[kcu].[table_name] = [tc].[table_name] AND
[kcu].[constraint_name] = [tc].[constraint_name]
E
[tc].[constraint_type] = :type AND
[kcu].[table_name] = :tableName AND
[kcu].[table_schema] = :schemaName
return $this->db
->createCommand($sql, [
':tableName' => $table->name,
':schemaName' => $table->schemaName,
':type' => $type,
])
->queryAll();
}
返回数据库中的所有表名。
此方法应由子类覆盖以支持此功能,因为默认实现只是抛出异常。
protected array findTableNames ( $schema = '' ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式。 |
返回值 | array |
数据库中的所有表名。名称没有模式名称前缀。 |
---|---|---|
抛出异常 | yii\base\NotSupportedException |
如果此方法不受 DBMS 支持。 |
protected function findTableNames($schema = '')
{
if ($schema === '') {
$schema = $this->defaultSchema;
}
$sql = <<<'SQL'
CT [t].[table_name]
[INFORMATION_SCHEMA].[TABLES] AS [t]
E [t].[table_schema] = :schema AND [t].[table_type] IN ('BASE TABLE', 'VIEW')
R BY [t].[table_name]
return $this->db->createCommand($sql, [':schema' => $schema])->queryColumn();
}
返回给定表的唯一索引。
每个数组元素的结构如下
[
'IndexName1' => ['col1' [, ...]],
'IndexName2' => ['col2' [, ...]],
]
public array findUniqueIndexes ( $table ) | ||
$table | yii\db\mssql\TableSchema |
表元数据 |
返回值 | array |
给定表的全部唯一索引。 |
---|
public function findUniqueIndexes($table)
{
$result = [];
foreach ($this->findTableConstraints($table, 'UNIQUE') as $row) {
$result[$row['index_name']][] = $row['field_name'];
}
return $result;
}
protected void findViewNames ( $schema = '' ) | ||
$schema |
protected function findViewNames($schema = '')
{
if ($schema === '') {
$schema = $this->defaultSchema;
}
$sql = <<<'SQL'
CT [t].[table_name]
[INFORMATION_SCHEMA].[TABLES] AS [t]
E [t].[table_schema] = :schema AND [t].[table_type] = 'VIEW'
R BY [t].[table_name]
return $this->db->createCommand($sql, [':schema' => $schema])->queryColumn();
}
定义于: yii\db\Schema::getCacheKey()
返回指定表名的缓存键。
protected mixed getCacheKey ( $name ) | ||
$name | string |
表名。 |
返回值 | mixed |
缓存键。 |
---|
protected function getCacheKey($name)
{
return [
__CLASS__,
$this->db->dsn,
$this->db->username,
$this->getRawTableName($name),
];
}
protected string getCacheTag ( ) | ||
返回值 | string |
缓存标签名 |
---|
protected function getCacheTag()
{
return md5(serialize([
__CLASS__,
$this->db->dsn,
$this->db->username,
]));
}
定义于: yii\db\Schema::getColumnPhpType()
从抽象 DB 类型中提取 PHP 类型。
protected string getColumnPhpType ( $column ) | ||
$column | yii\db\ColumnSchema |
列模式信息 |
返回值 | string |
PHP 类型名称 |
---|
protected function getColumnPhpType($column)
{
static $typeMap = [
// abstract type => php type
self::TYPE_TINYINT => 'integer',
self::TYPE_SMALLINT => 'integer',
self::TYPE_INTEGER => 'integer',
self::TYPE_BIGINT => 'integer',
self::TYPE_BOOLEAN => 'boolean',
self::TYPE_FLOAT => 'double',
self::TYPE_DOUBLE => 'double',
self::TYPE_BINARY => 'resource',
self::TYPE_JSON => 'array',
];
if (isset($typeMap[$column->type])) {
if ($column->type === 'bigint') {
return PHP_INT_SIZE === 8 && !$column->unsigned ? 'integer' : 'string';
} elseif ($column->type === 'integer') {
return PHP_INT_SIZE === 4 && $column->unsigned ? 'string' : 'integer';
}
return $typeMap[$column->type];
}
return 'string';
}
定义于: yii\db\Schema::getLastInsertID()
返回最后插入行的 ID 或序列值。
另请参阅 https://php.ac.cn/manual/en/function.PDO-lastInsertId.php.
public string getLastInsertID ( $sequenceName = '' ) | ||
$sequenceName | string |
序列对象的名称(某些 DBMS 需要) |
返回值 | string |
插入的最后一行行 ID,或从序列对象检索的最后一个值 |
---|---|---|
抛出异常 | yii\base\InvalidCallException |
如果 DB 连接未处于活动状态 |
public function getLastInsertID($sequenceName = '')
{
if ($this->db->isActive) {
return $this->db->pdo->lastInsertId($sequenceName === '' ? null : $this->quoteTableName($sequenceName));
}
throw new InvalidCallException('DB Connection is not active.');
}
定义于: yii\db\Schema::getPdoType()
确定给定 PHP 数据值的 PDO 类型。
public integer getPdoType ( $data ) | ||
$data | mixed |
要确定其 PDO 类型的 data |
返回值 | integer |
PDO 类型 |
---|
public function getPdoType($data)
{
static $typeMap = [
// php type => PDO type
'boolean' => \PDO::PARAM_BOOL,
'integer' => \PDO::PARAM_INT,
'string' => \PDO::PARAM_STR,
'resource' => \PDO::PARAM_LOB,
'NULL' => \PDO::PARAM_NULL,
];
$type = gettype($data);
return isset($typeMap[$type]) ? $typeMap[$type] : \PDO::PARAM_STR;
}
public yii\db\QueryBuilder getQueryBuilder ( ) | ||
返回值 | yii\db\QueryBuilder |
此连接的查询构建器。 |
---|
public function getQueryBuilder()
{
if ($this->_builder === null) {
$this->_builder = $this->createQueryBuilder();
}
return $this->_builder;
}
定义于: yii\db\Schema::getRawTableName()
返回给定表名的实际名称。
此方法将从给定的表名中剥离花括号,并将百分号字符“%”替换为 yii\db\Connection::$tablePrefix。
public string getRawTableName ( $name ) | ||
$name | string |
要转换的表名 |
返回值 | string |
给定表名的真实名称 |
---|
public function getRawTableName($name)
{
if (strpos($name, '{{') !== false) {
$name = preg_replace('/\\{\\{(.*?)\\}\\}/', '\1', $name);
return str_replace('%', $this->db->tablePrefix, $name);
}
return $name;
}
定义于: yii\db\ConstraintFinderTrait::getSchemaChecks()
返回数据库中所有表的检查约束。
public \yii\db\CheckConstraint[][] getSchemaChecks ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名。 |
$refresh | boolean |
是否获取最新的可用表模式。如果为 false,则如果可用,可能会返回缓存的数据。 |
返回值 | \yii\db\CheckConstraint[][] |
检查数据库中所有表的约束。每个数组元素都是一个包含 yii\db\CheckConstraint 或其子类的数组。 |
---|
public function getSchemaChecks($schema = '', $refresh = false)
{
return $this->getSchemaMetadata($schema, 'checks', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getSchemaDefaultValues()
返回数据库中所有表的默认值约束。
public yii\db\DefaultValueConstraint[] getSchemaDefaultValues ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名。 |
$refresh | boolean |
是否获取最新的可用表模式。如果为 false,则如果可用,可能会返回缓存的数据。 |
返回值 | yii\db\DefaultValueConstraint[] |
数据库中所有表的默认值约束。每个数组元素都是一个包含 yii\db\DefaultValueConstraint 或其子类的数组。 |
---|
public function getSchemaDefaultValues($schema = '', $refresh = false)
{
return $this->getSchemaMetadata($schema, 'defaultValues', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getSchemaForeignKeys()
返回数据库中所有表的外部键。
public \yii\db\ForeignKeyConstraint[][] getSchemaForeignKeys ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名。 |
$refresh | boolean |
是否获取最新的可用表模式。如果为 false,则如果可用,可能会返回缓存的数据。 |
返回值 | \yii\db\ForeignKeyConstraint[][] |
数据库中所有表的外部键。每个数组元素都是一个包含 yii\db\ForeignKeyConstraint 或其子类的数组。 |
---|
public function getSchemaForeignKeys($schema = '', $refresh = false)
{
return $this->getSchemaMetadata($schema, 'foreignKeys', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getSchemaIndexes()
返回数据库中所有表的索引。
public \yii\db\IndexConstraint[][] getSchemaIndexes ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名。 |
$refresh | boolean |
是否获取最新的可用表模式。如果为 false,则如果可用,可能会返回缓存的数据。 |
返回值 | \yii\db\IndexConstraint[][] |
数据库中所有表的索引。每个数组元素都是一个包含 yii\db\IndexConstraint 或其子类的数组。 |
---|
public function getSchemaIndexes($schema = '', $refresh = false)
{
return $this->getSchemaMetadata($schema, 'indexes', $refresh);
}
返回给定类型的所有表在给定模式中的元数据。
此方法将调用名为 'getTable' . ucfirst($type)
的方法,并传入表名和刷新标志以获取元数据。
protected array getSchemaMetadata ( $schema, $type, $refresh ) | ||
$schema | string |
元数据的模式。默认为空字符串,表示当前或默认模式名。 |
$type | string |
元数据类型。 |
$refresh | boolean |
是否获取最新的可用表元数据。如果为 |
返回值 | array |
元数据的数组。 |
---|
protected function getSchemaMetadata($schema, $type, $refresh)
{
$metadata = [];
$methodName = 'getTable' . ucfirst($type);
$tableNames = array_map(function ($table) {
return $this->quoteSimpleTableName($table);
}, $this->getTableNames($schema, $refresh));
foreach ($tableNames as $name) {
if ($schema !== '') {
$name = $schema . '.' . $name;
}
$tableMetadata = $this->$methodName($name, $refresh);
if ($tableMetadata !== null) {
$metadata[] = $tableMetadata;
}
}
return $metadata;
}
定义于: yii\db\Schema::getSchemaNames()
返回数据库中的所有模式名称,除了系统模式。
public string[] getSchemaNames ( $refresh = false ) | ||
$refresh | boolean |
是否获取最新的可用模式名称。如果为 false,将返回先前获取的模式名称(如果可用)。 |
返回值 | string[] |
数据库中的所有模式名称,除了系统模式。 |
---|
public function getSchemaNames($refresh = false)
{
if ($this->_schemaNames === null || $refresh) {
$this->_schemaNames = $this->findSchemaNames();
}
return $this->_schemaNames;
}
定义于: yii\db\ConstraintFinderTrait::getSchemaPrimaryKeys()
返回数据库中所有表的 primary key。
public yii\db\Constraint[] getSchemaPrimaryKeys ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名。 |
$refresh | boolean |
是否获取最新的可用表模式。如果为 |
返回值 | yii\db\Constraint[] |
数据库中所有表的主键。每个数组元素都是 yii\db\Constraint 或其子类的实例。 |
---|
public function getSchemaPrimaryKeys($schema = '', $refresh = false)
{
return $this->getSchemaMetadata($schema, 'primaryKey', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getSchemaUniques()
返回数据库中所有表的唯一约束。
public \yii\db\Constraint[][] getSchemaUniques ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名。 |
$refresh | boolean |
是否获取最新的可用表模式。如果为 false,则如果可用,可能会返回缓存的数据。 |
返回值 | \yii\db\Constraint[][] |
数据库中所有表的唯一约束。每个数组元素都是一个包含 yii\db\Constraint 或其子类的数组。 |
---|
public function getSchemaUniques($schema = '', $refresh = false)
{
return $this->getSchemaMetadata($schema, 'uniques', $refresh);
}
定义于: yii\db\Schema::getServerVersion()
返回一个服务器版本作为字符串,可以通过 \version_compare() 进行比较。
public string getServerVersion ( ) | ||
返回值 | string |
服务器版本作为字符串。 |
---|
public function getServerVersion()
{
if ($this->_serverVersion === null) {
$this->_serverVersion = $this->db->getSlavePdo(true)->getAttribute(\PDO::ATTR_SERVER_VERSION);
}
return $this->_serverVersion;
}
定义于: yii\db\ConstraintFinderTrait::getTableChecks()
获取命名表的检查约束信息。
public yii\db\CheckConstraint[] getTableChecks ( $name, $refresh = false ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$refresh | boolean |
是否即使在缓存中找到信息也要重新加载信息。 |
返回值 | yii\db\CheckConstraint[] |
表检查约束。 |
---|
public function getTableChecks($name, $refresh = false)
{
return $this->getTableMetadata($name, 'checks', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getTableDefaultValues()
获取命名表的默认值约束信息。
public yii\db\DefaultValueConstraint[] getTableDefaultValues ( $name, $refresh = false ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$refresh | boolean |
是否即使在缓存中找到信息也要重新加载信息。 |
返回值 | yii\db\DefaultValueConstraint[] |
表默认值约束。 |
---|
public function getTableDefaultValues($name, $refresh = false)
{
return $this->getTableMetadata($name, 'defaultValues', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getTableForeignKeys()
获取命名表的外部键信息。
public yii\db\ForeignKeyConstraint[] getTableForeignKeys ( $name, $refresh = false ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$refresh | boolean |
是否即使在缓存中找到信息也要重新加载信息。 |
返回值 | yii\db\ForeignKeyConstraint[] |
表外键。 |
---|
public function getTableForeignKeys($name, $refresh = false)
{
return $this->getTableMetadata($name, 'foreignKeys', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getTableIndexes()
获取命名表的索引信息。
public yii\db\IndexConstraint[] getTableIndexes ( $name, $refresh = false ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$refresh | boolean |
是否即使在缓存中找到信息也要重新加载信息。 |
返回值 | yii\db\IndexConstraint[] |
表索引。 |
---|
public function getTableIndexes($name, $refresh = false)
{
return $this->getTableMetadata($name, 'indexes', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getTableMetadata()
返回给定类型在给定表的元数据。
protected abstract mixed getTableMetadata ( $name, $type, $refresh ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$type | string |
元数据类型。 |
$refresh | boolean |
是否即使在缓存中找到表元数据也要重新加载。 |
返回值 | mixed |
元数据。 |
---|
abstract protected function getTableMetadata($name, $type, $refresh);
将完整表名拆分为各个部分
protected array getTableNameParts ( $name ) | ||
$name | string |
protected function getTableNameParts($name)
{
$parts = [$name];
preg_match_all('/([^.\[\]]+)|\[([^\[\]]+)\]/', $name, $matches);
if (isset($matches[0]) && is_array($matches[0]) && !empty($matches[0])) {
$parts = $matches[0];
}
$parts = str_replace(['[', ']'], '', $parts);
return $parts;
}
定义于: yii\db\Schema::getTableNames()
返回数据库中的所有表名。
public string[] getTableNames ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名称。如果不为空,则返回的表名将以模式名称作为前缀。 |
$refresh | boolean |
是否获取最新的可用表名。如果为 false,则返回之前获取的表名(如果可用)。 |
返回值 | string[] |
数据库中的所有表名。 |
---|
public function getTableNames($schema = '', $refresh = false)
{
if (!isset($this->_tableNames[$schema]) || $refresh) {
$this->_tableNames[$schema] = $this->findTableNames($schema);
}
return $this->_tableNames[$schema];
}
定义于: yii\db\ConstraintFinderTrait::getTablePrimaryKey()
获取命名表的主键。
public yii\db\Constraint|null getTablePrimaryKey ( $name, $refresh = false ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$refresh | boolean |
是否即使在缓存中找到信息也要重新加载信息。 |
返回值 | yii\db\Constraint|null |
表主键,如果表没有主键,则为 |
---|
public function getTablePrimaryKey($name, $refresh = false)
{
return $this->getTableMetadata($name, 'primaryKey', $refresh);
}
定义于: yii\db\Schema::getTableSchema()
获取命名表的元数据。
public yii\db\TableSchema|null getTableSchema ( $name, $refresh = false ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$refresh | boolean |
是否即使在缓存中找到表模式也要重新加载。 |
返回值 | yii\db\TableSchema|null |
表元数据。如果指定的表不存在,则为 |
---|
public function getTableSchema($name, $refresh = false)
{
return $this->getTableMetadata($name, 'schema', $refresh);
}
定义于: yii\db\Schema::getTableSchemas()
返回数据库中所有表的元数据。
public yii\db\TableSchema[] getTableSchemas ( $schema = '', $refresh = false ) | ||
$schema | string |
表的模式。默认为空字符串,表示当前或默认模式名。 |
$refresh | boolean |
是否获取最新的可用表模式。如果为 |
返回值 | yii\db\TableSchema[] |
数据库中所有表的元数据。每个数组元素都是 yii\db\TableSchema 或其子类的实例。 |
---|
public function getTableSchemas($schema = '', $refresh = false)
{
return $this->getSchemaMetadata($schema, 'schema', $refresh);
}
定义于: yii\db\ConstraintFinderTrait::getTableUniques()
获取命名表的唯一约束信息。
public yii\db\Constraint[] getTableUniques ( $name, $refresh = false ) | ||
$name | string |
表名。表名可能包含模式名(如果有)。不要引用表名。 |
$refresh | boolean |
是否即使在缓存中找到信息也要重新加载信息。 |
返回值 | yii\db\Constraint[] |
表唯一约束。 |
---|
public function getTableUniques($name, $refresh = false)
{
return $this->getTableMetadata($name, 'uniques', $refresh);
}
定义于: yii\db\ViewFinderTrait::getViewNames()
返回数据库中的所有视图名称。
public string[] getViewNames ( $schema = '', $refresh = false ) | ||
$schema | string |
视图的模式。默认为空字符串,表示当前或默认模式名称。如果不为空,则返回的视图名将以模式名称作为前缀。 |
$refresh | boolean |
是否获取最新的可用视图名。如果为 false,则返回之前获取的视图名(如果可用)。 |
返回值 | string[] |
数据库中的所有视图名称。 |
---|
public function getViewNames($schema = '', $refresh = false)
{
if (!isset($this->_viewNames[$schema]) || $refresh) {
$this->_viewNames[$schema] = $this->findViewNames($schema);
}
return $this->_viewNames[$schema];
}
定义于: yii\base\BaseObject::hasMethod()
返回一个值,指示是否定义了方法。
默认实现调用 php 函数 method_exists()
。当您实现 php 魔术方法 __call()
时,您可能需要重写此方法。
public boolean hasMethod ( $name ) | ||
$name | string |
方法名称 |
返回值 | boolean |
该方法是否已定义。 |
---|
public function hasMethod($name)
{
return method_exists($this, $name);
}
定义于: yii\base\BaseObject::hasProperty()
返回一个值,指示是否定义了属性。
如果属性定义了以下情况:
- 该类具有与指定名称关联的 getter 或 setter 方法(在本例中,属性名称不区分大小写);
- 该类具有与指定名称相同的成员变量(当
$checkVars
为 true 时);
另请参见
public boolean hasProperty ( $name, $checkVars = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
返回值 | boolean |
属性是否已定义 |
---|
public function hasProperty($name, $checkVars = true)
{
return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}
public void init ( ) |
public function init()
{
}
从类型为 uniqueidentifier 的主键请求中检索插入的数据(适用于 SQL Server 2005 或更高版本){@inheritdoc}
public void insert ( $table, $columns ) | ||
$table | ||
$columns |
public function insert($table, $columns)
{
$command = $this->db->createCommand()->insert($table, $columns);
if (!$command->execute()) {
return false;
}
$isVersion2005orLater = version_compare($this->db->getSchema()->getServerVersion(), '9', '>=');
$inserted = $isVersion2005orLater ? $command->pdoStatement->fetch() : [];
$tableSchema = $this->getTableSchema($table);
$result = [];
foreach ($tableSchema->primaryKey as $name) {
// @see https://github.com/yiisoft/yii2/issues/13828 & https://github.com/yiisoft/yii2/issues/17474
if (isset($inserted[$name])) {
$result[$name] = $inserted[$name];
} elseif ($tableSchema->columns[$name]->autoIncrement) {
// for a version earlier than 2005
$result[$name] = $this->getLastInsertID($tableSchema->sequenceName);
} elseif (isset($columns[$name])) {
$result[$name] = $columns[$name];
} else {
$result[$name] = $tableSchema->columns[$name]->defaultValue;
}
}
return $result;
}
定义于: yii\db\Schema::isReadQuery()
返回一个值,指示 SQL 语句是否用于读取目的。
public boolean isReadQuery ( $sql ) | ||
$sql | string |
SQL 语句 |
返回值 | boolean |
SQL 语句是否用于读取目的。 |
---|
public function isReadQuery($sql)
{
$pattern = '/^\s*(SELECT|SHOW|DESCRIBE)\b/i';
return preg_match($pattern, $sql) > 0;
}
将列信息加载到 yii\db\mssql\ColumnSchema 对象中。
protected yii\db\mssql\ColumnSchema loadColumnSchema ( $info ) | ||
$info | array |
列信息 |
返回值 | yii\db\mssql\ColumnSchema |
列模式对象 |
---|
protected function loadColumnSchema($info)
{
$isVersion2017orLater = version_compare($this->db->getSchema()->getServerVersion(), '14', '>=');
$column = $this->createColumnSchema();
$column->name = $info['column_name'];
$column->allowNull = $info['is_nullable'] === 'YES';
$column->dbType = $info['data_type'];
$column->enumValues = []; // mssql has only vague equivalents to enum
$column->isPrimaryKey = null; // primary key will be determined in findColumns() method
$column->autoIncrement = $info['is_identity'] == 1;
$column->isComputed = (bool)$info['is_computed'];
$column->unsigned = stripos($column->dbType, 'unsigned') !== false;
$column->comment = $info['comment'] === null ? '' : $info['comment'];
$column->type = self::TYPE_STRING;
if (preg_match('/^(\w+)(?:\(([^\)]+)\))?/', $column->dbType, $matches)) {
$type = $matches[1];
if (isset($this->typeMap[$type])) {
$column->type = $this->typeMap[$type];
}
if ($isVersion2017orLater && $type === 'bit') {
$column->type = 'boolean';
}
if (!empty($matches[2])) {
$values = explode(',', $matches[2]);
$column->size = $column->precision = (int) $values[0];
if (isset($values[1])) {
$column->scale = (int) $values[1];
}
if ($isVersion2017orLater === false) {
$column->type = $this->booleanTypeLegacy($column->size, $type);
}
}
}
$column->phpType = $this->getColumnPhpType($column);
if ($info['column_default'] === '(NULL)') {
$info['column_default'] = null;
}
if (!$column->isPrimaryKey && ($column->type !== 'timestamp' || $info['column_default'] !== 'CURRENT_TIMESTAMP')) {
$column->defaultValue = $column->defaultPhpTypecast($info['column_default']);
}
return $column;
}
protected void loadTableChecks ( $tableName ) | ||
$tableName |
protected function loadTableChecks($tableName)
{
return $this->loadTableConstraints($tableName, 'checks');
}
protected void loadTableDefaultValues ( $tableName ) | ||
$tableName |
protected function loadTableDefaultValues($tableName)
{
return $this->loadTableConstraints($tableName, 'defaults');
}
protected void loadTableForeignKeys ( $tableName ) | ||
$tableName |
protected function loadTableForeignKeys($tableName)
{
return $this->loadTableConstraints($tableName, 'foreignKeys');
}
protected void loadTableIndexes ( $tableName ) | ||
$tableName |
protected function loadTableIndexes($tableName)
{
static $sql = <<<'SQL'
CT
[i].[name] AS [name],
[iccol].[name] AS [column_name],
[i].[is_unique] AS [index_is_unique],
[i].[is_primary_key] AS [index_is_primary]
[sys].[indexes] AS [i]
R JOIN [sys].[index_columns] AS [ic]
ON [ic].[object_id] = [i].[object_id] AND [ic].[index_id] = [i].[index_id]
R JOIN [sys].[columns] AS [iccol]
ON [iccol].[object_id] = [ic].[object_id] AND [iccol].[column_id] = [ic].[column_id]
E [i].[object_id] = OBJECT_ID(:fullName)
R BY [ic].[key_ordinal] ASC
$resolvedName = $this->resolveTableName($tableName);
$indexes = $this->db->createCommand($sql, [
':fullName' => $resolvedName->fullName,
])->queryAll();
$indexes = $this->normalizePdoRowKeyCase($indexes, true);
$indexes = ArrayHelper::index($indexes, null, 'name');
$result = [];
foreach ($indexes as $name => $index) {
$result[] = new IndexConstraint([
'isPrimary' => (bool)$index[0]['index_is_primary'],
'isUnique' => (bool)$index[0]['index_is_unique'],
'name' => $name,
'columnNames' => ArrayHelper::getColumn($index, 'column_name'),
]);
}
return $result;
}
protected void loadTablePrimaryKey ( $tableName ) | ||
$tableName |
protected function loadTablePrimaryKey($tableName)
{
return $this->loadTableConstraints($tableName, 'primaryKey');
}
加载指定表的元数据。
protected yii\db\TableSchema|null loadTableSchema ( $name ) | ||
$name | string |
表名 |
返回值 | yii\db\TableSchema|null |
与 DBMS 相关的表元数据,如果表不存在,则为 |
---|
protected function loadTableSchema($name)
{
$table = new TableSchema();
$this->resolveTableNames($table, $name);
$this->findPrimaryKeys($table);
if ($this->findColumns($table)) {
$this->findForeignKeys($table);
return $table;
}
return null;
}
protected void loadTableUniques ( $tableName ) | ||
$tableName |
protected function loadTableUniques($tableName)
{
return $this->loadTableConstraints($tableName, 'uniques');
}
定义于: yii\db\Schema::normalizePdoRowKeyCase()
如果 PDO 的数组键大小写设置为大写,则将行数组键大小写更改为小写。
protected array normalizePdoRowKeyCase ( array $row, $multiple ) | ||
$row | array |
行的数组或行的数组的数组。 |
$multiple | boolean |
是否传递了多行或单行。 |
返回值 | array |
标准化的行或行。 |
---|
protected function normalizePdoRowKeyCase(array $row, $multiple)
{
if ($this->db->getSlavePdo(true)->getAttribute(\PDO::ATTR_CASE) !== \PDO::CASE_UPPER) {
return $row;
}
if ($multiple) {
return array_map(function (array $row) {
return array_change_key_case($row, CASE_LOWER);
}, $row);
}
return array_change_key_case($row, CASE_LOWER);
}
引用查询中使用的列名。
如果列名包含前缀,则前缀也将被适当地引用。如果列名已经被引用或包含 '(', '[[' 或 '{{',则此方法将不执行任何操作。
public string quoteColumnName ( $name ) | ||
$name | string |
列名 |
返回值 | string |
正确引用的列名 |
---|
public function quoteColumnName($name)
{
if (preg_match('/^\[.*\]$/', $name)) {
return $name;
}
return parent::quoteColumnName($name);
}
定义于: yii\db\Schema::quoteSimpleColumnName()
引用查询中使用的简单列名。
简单列名应仅包含列名,不含任何前缀。如果列名已经被引用或为星号字符 '*',则此方法将不执行任何操作。
public string quoteSimpleColumnName ( $name ) | ||
$name | string |
列名 |
返回值 | string |
正确引用的列名 |
---|
public function quoteSimpleColumnName($name)
{
if (is_string($this->columnQuoteCharacter)) {
$startingCharacter = $endingCharacter = $this->columnQuoteCharacter;
} else {
list($startingCharacter, $endingCharacter) = $this->columnQuoteCharacter;
}
return $name === '*' || strpos($name, $startingCharacter) !== false ? $name : $startingCharacter . $name . $endingCharacter;
}
定义在: yii\db\Schema::quoteSimpleTableName()
引用查询中使用的简单表名。
一个简单的表名应该只包含表名,不包含任何模式前缀。如果表名已经被引用,则此方法将不做任何操作。
public string quoteSimpleTableName ( $name ) | ||
$name | string |
表名 |
返回值 | string |
正确引用的表名 |
---|
public function quoteSimpleTableName($name)
{
if (is_string($this->tableQuoteCharacter)) {
$startingCharacter = $endingCharacter = $this->tableQuoteCharacter;
} else {
list($startingCharacter, $endingCharacter) = $this->tableQuoteCharacter;
}
return strpos($name, $startingCharacter) !== false ? $name : $startingCharacter . $name . $endingCharacter;
}
定义在: yii\db\Schema::quoteTableName()
引用查询中使用的表名。
如果表名包含模式前缀,则前缀也将被正确引用。如果表名已经被引用,或者包含 '(' 或 '{{',则此方法将不做任何操作。
另请参阅 quoteSimpleTableName().
public string quoteTableName ( $name ) | ||
$name | string |
表名 |
返回值 | string |
正确引用的表名 |
---|
public function quoteTableName($name)
{
if (strncmp($name, '(', 1) === 0 && strpos($name, ')') === strlen($name) - 1) {
return $name;
}
if (strpos($name, '{{') !== false) {
return $name;
}
if (strpos($name, '.') === false) {
return $this->quoteSimpleTableName($name);
}
$parts = $this->getTableNameParts($name);
foreach ($parts as $i => $part) {
$parts[$i] = $this->quoteSimpleTableName($part);
}
return implode('.', $parts);
}
public string quoteValue ( $str ) | ||
$str | string |
要引用的字符串 |
返回值 | string |
正确引用的字符串 |
---|
public function quoteValue($str)
{
if (!is_string($str)) {
return $str;
}
if (mb_stripos((string)$this->db->dsn, 'odbc:') === false && ($value = $this->db->getSlavePdo(true)->quote($str)) !== false) {
return $value;
}
// the driver doesn't support quote (e.g. oci)
return "'" . addcslashes(str_replace("'", "''", $str), "\000\n\r\\\032") . "'";
}
public void refresh ( ) |
public function refresh()
{
/* @var $cache CacheInterface */
$cache = is_string($this->db->schemaCache) ? Yii::$app->get($this->db->schemaCache, false) : $this->db->schemaCache;
if ($this->db->enableSchemaCache && $cache instanceof CacheInterface) {
TagDependency::invalidate($cache, $this->getCacheTag());
}
$this->_tableNames = [];
$this->_tableMetadata = [];
}
public void refreshTableSchema ( $name ) | ||
$name | string |
表名。 |
public function refreshTableSchema($name)
{
$rawName = $this->getRawTableName($name);
unset($this->_tableMetadata[$rawName]);
$this->_tableNames = [];
/* @var $cache CacheInterface */
$cache = is_string($this->db->schemaCache) ? Yii::$app->get($this->db->schemaCache, false) : $this->db->schemaCache;
if ($this->db->enableSchemaCache && $cache instanceof CacheInterface) {
$cache->delete($this->getCacheKey($rawName));
}
}
释放现有保存点。
public void releaseSavepoint ( $name ) | ||
$name | string |
保存点名称 |
public function releaseSavepoint($name)
{
// does nothing as MSSQL does not support this
}
解析表名和模式名(如果有)。
protected yii\db\mssql\TableSchema resolveTableName ( $name ) | ||
$name | string |
表名 |
返回值 | yii\db\mssql\TableSchema |
解析后的表、模式等名称。 |
---|
protected function resolveTableName($name)
{
$resolvedName = new TableSchema();
$parts = $this->getTableNameParts($name);
$partCount = count($parts);
if ($partCount === 4) {
// server name, catalog name, schema name and table name passed
$resolvedName->catalogName = $parts[1];
$resolvedName->schemaName = $parts[2];
$resolvedName->name = $parts[3];
$resolvedName->fullName = $resolvedName->catalogName . '.' . $resolvedName->schemaName . '.' . $resolvedName->name;
} elseif ($partCount === 3) {
// catalog name, schema name and table name passed
$resolvedName->catalogName = $parts[0];
$resolvedName->schemaName = $parts[1];
$resolvedName->name = $parts[2];
$resolvedName->fullName = $resolvedName->catalogName . '.' . $resolvedName->schemaName . '.' . $resolvedName->name;
} elseif ($partCount === 2) {
// only schema name and table name passed
$resolvedName->schemaName = $parts[0];
$resolvedName->name = $parts[1];
$resolvedName->fullName = ($resolvedName->schemaName !== $this->defaultSchema ? $resolvedName->schemaName . '.' : '') . $resolvedName->name;
} else {
// only table name passed
$resolvedName->schemaName = $this->defaultSchema;
$resolvedName->fullName = $resolvedName->name = $parts[0];
}
return $resolvedName;
}
解析表名和模式名(如果有)。
protected void resolveTableNames ( $table, $name ) | ||
$table | yii\db\mssql\TableSchema |
表元数据对象 |
$name | string |
表名 |
protected function resolveTableNames($table, $name)
{
$parts = $this->getTableNameParts($name);
$partCount = count($parts);
if ($partCount === 4) {
// server name, catalog name, schema name and table name passed
$table->catalogName = $parts[1];
$table->schemaName = $parts[2];
$table->name = $parts[3];
$table->fullName = $table->catalogName . '.' . $table->schemaName . '.' . $table->name;
} elseif ($partCount === 3) {
// catalog name, schema name and table name passed
$table->catalogName = $parts[0];
$table->schemaName = $parts[1];
$table->name = $parts[2];
$table->fullName = $table->catalogName . '.' . $table->schemaName . '.' . $table->name;
} elseif ($partCount === 2) {
// only schema name and table name passed
$table->schemaName = $parts[0];
$table->name = $parts[1];
$table->fullName = $table->schemaName !== $this->defaultSchema ? $table->schemaName . '.' . $table->name : $table->name;
} else {
// only table name passed
$table->schemaName = $this->defaultSchema;
$table->fullName = $table->name = $parts[0];
}
}
回滚到先前创建的保存点。
public void rollBackSavepoint ( $name ) | ||
$name | string |
保存点名称 |
public function rollBackSavepoint($name)
{
$this->db->createCommand("ROLLBACK TRANSACTION $name")->execute();
}
定义在: yii\db\Schema::setTableMetadata()
设置给定类型在给定表的元数据。
protected void setTableMetadata ( $name, $type, $data ) | ||
$name | string |
表名。 |
$type | string |
元数据类型。 |
$data | mixed |
元数据。 |
protected function setTableMetadata($name, $type, $data)
{
$this->_tableMetadata[$this->getRawTableName($name)][$type] = $data;
}
定义在: yii\db\Schema::setTransactionIsolationLevel()
设置当前事务的隔离级别。
另请参阅 https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels.
public void setTransactionIsolationLevel ( $level ) | ||
$level | string |
此事务要使用的隔离级别。可以是 yii\db\Transaction::READ_UNCOMMITTED、yii\db\Transaction::READ_COMMITTED、yii\db\Transaction::REPEATABLE_READ 和 yii\db\Transaction::SERIALIZABLE,也可以是包含 DBMS 特定语法的字符串,这些字符串将在 |
public function setTransactionIsolationLevel($level)
{
$this->db->createCommand("SET TRANSACTION ISOLATION LEVEL $level")->execute();
}
public boolean supportsSavepoint ( ) | ||
返回值 | boolean |
此 DBMS 是否支持 保存点。 |
---|
public function supportsSavepoint()
{
return $this->db->enableSavepoint;
}
定义在: yii\db\Schema::unquoteSimpleColumnName()
取消简单列名的引号。
一个简单的列名应该只包含列名,不包含任何前缀。如果列名没有被引用,或者为星号字符 '*',则此方法将不做任何操作。
公共 字符串 unquoteSimpleColumnName ( $name ) | ||
$name | string |
列名。 |
返回值 | string |
未加引号的列名。 |
---|
public function unquoteSimpleColumnName($name)
{
if (is_string($this->columnQuoteCharacter)) {
$startingCharacter = $this->columnQuoteCharacter;
} else {
$startingCharacter = $this->columnQuoteCharacter[0];
}
return strpos($name, $startingCharacter) === false ? $name : substr($name, 1, -1);
}
定义于: yii\db\Schema::unquoteSimpleTableName()
取消简单表名的引号。
一个简单的表名应该只包含表名,不包含任何架构前缀。如果表名没有加引号,此方法将不做任何操作。
公共 字符串 unquoteSimpleTableName ( $name ) | ||
$name | string |
表名。 |
返回值 | string |
未加引号的表名。 |
---|
public function unquoteSimpleTableName($name)
{
if (is_string($this->tableQuoteCharacter)) {
$startingCharacter = $this->tableQuoteCharacter;
} else {
$startingCharacter = $this->tableQuoteCharacter[0];
}
return strpos($name, $startingCharacter) === false ? $name : substr($name, 1, -1);
}
注册 或者 登录 以便评论。