0 关注者

抽象类 yii\db\Schema

继承yii\db\Schema » yii\base\BaseObject
实现yii\base\Configurable
子类yii\db\cubrid\Schema, yii\db\mssql\Schema, yii\db\mysql\Schema, yii\db\oci\Schema, yii\db\pgsql\Schema, yii\db\sqlite\Schema
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/db/Schema.php

Schema 是具体 DBMS 特定 Schema 类的基类。

Schema 表示与 DBMS 相关的数据库 Schema 信息。

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$columnQuoteCharacter string|string[] 用于引用列名的字符。 yii\db\Schema
$columnSchemaClass string|array 列 Schema 类或类配置 yii\db\Schema
$db yii\db\Connection 数据库连接 yii\db\Schema
$defaultSchema string 当前会话使用的默认 Schema 名。 yii\db\Schema
$exceptionMap array DB 错误和对应异常的映射 如果在 DB 错误消息中找到左侧部分,则使用右侧部分的异常类。 yii\db\Schema
$lastInsertID string 最后插入行的行 ID,或从序列对象检索的最后一个值。 yii\db\Schema
$queryBuilder yii\db\QueryBuilder 此连接的查询构建器。 yii\db\Schema
$schemaNames string[] 数据库中的所有 Schema 名,除了系统 Schema。 yii\db\Schema
$serverVersion string 服务器版本作为字符串。 yii\db\Schema
$tableNames string[] 数据库中的所有表名。 yii\db\Schema
$tableQuoteCharacter string|string[] 用于引用 Schema、表等的字符。 yii\db\Schema
$tableSchemas yii\db\TableSchema[] 数据库中所有表的元数据。 yii\db\Schema
$transactionIsolationLevel string 此事务使用的隔离级别。 yii\db\Schema

受保护的属性

隐藏继承的属性

属性 类型 描述 定义于

公共方法

隐藏继承的方法

方法 描述 定义于
__call() 调用不是类方法的命名方法。 yii\base\BaseObject
__construct() 构造函数。 yii\base\BaseObject
__get() 返回对象属性的值。 yii\base\BaseObject
__isset() 检查是否设置了属性,即定义且不为空。 yii\base\BaseObject
__set() 设置对象属性的值。 yii\base\BaseObject
__unset() 将对象属性设置为 null。 yii\base\BaseObject
canGetProperty() 返回一个值,指示是否可以读取属性。 yii\base\BaseObject
canSetProperty() 返回一个值,指示是否可以设置属性。 yii\base\BaseObject
className() 返回此类的完全限定名称。 yii\base\BaseObject
convertException() 如果可能,将 DB 异常转换为更具体的异常。 yii\db\Schema
createColumnSchemaBuilder() 创建列 Schema 构建器实例,给出类型和值精度。 yii\db\Schema
createQueryBuilder() 为数据库创建查询构建器。 yii\db\Schema
createSavepoint() 创建一个新的保存点。 yii\db\Schema
findUniqueIndexes() 返回给定表的所以唯一索引。 yii\db\Schema
getLastInsertID() 返回最后插入行的 ID 或序列值。 yii\db\Schema
getPdoType() 确定给定 PHP 数据值的 PDO 类型。 yii\db\Schema
getQueryBuilder() yii\db\Schema
getRawTableName() 返回给定表名的实际名称。 yii\db\Schema
getSchemaNames() 返回数据库中的所有 Schema 名,除了系统 Schema。 yii\db\Schema
getServerVersion() 返回一个服务器版本,作为可通过 \version_compare() 进行比较的字符串。 yii\db\Schema
getTableNames() 返回数据库中的所有表名。 yii\db\Schema
getTableSchema() 获取指定表的元数据。 yii\db\Schema
getTableSchemas() 返回数据库中所有表的元数据。 yii\db\Schema
hasMethod() 返回一个值,指示是否定义了方法。 yii\base\BaseObject
hasProperty() 返回一个值,指示是否定义了属性。 yii\base\BaseObject
init() 初始化对象。 yii\base\BaseObject
insert() 执行 INSERT 命令,返回主键值。 yii\db\Schema
isReadQuery() 返回一个值,指示 SQL 语句是否用于读取目的。 yii\db\Schema
quoteColumnName() 引用查询中使用的列名。 yii\db\Schema
quoteSimpleColumnName() 引用查询中使用的简单列名。 yii\db\Schema
quoteSimpleTableName() 引用查询中使用的简单表名。 yii\db\Schema
quoteTableName() 引用查询中使用的表名。 yii\db\Schema
quoteValue() 引用查询中使用的字符串值。 yii\db\Schema
refresh() 刷新 Schema。 yii\db\Schema
refreshTableSchema() 刷新特定表 Schema。 yii\db\Schema
releaseSavepoint() 释放现有保存点。 yii\db\Schema
rollBackSavepoint() 回滚到先前创建的保存点。 yii\db\Schema
setTransactionIsolationLevel() 设置当前事务的隔离级别。 yii\db\Schema
supportsSavepoint() yii\db\Schema
unquoteSimpleColumnName() 取消引用简单列名。 yii\db\Schema
unquoteSimpleTableName() 取消引用简单表名。 yii\db\Schema

受保护的方法

隐藏继承的方法

方法 描述 定义于
createColumnSchema() 为数据库创建列 Schema。 yii\db\Schema
findSchemaNames() 返回数据库中的所有 Schema 名,包括默认 Schema,但不包括系统 Schema。 yii\db\Schema
findTableNames() 返回数据库中的所有表名。 yii\db\Schema
getCacheKey() 返回指定表名的缓存键。 yii\db\Schema
getCacheTag() 返回缓存标签名。 yii\db\Schema
getColumnPhpType() 从抽象 DB 类型中提取 PHP 类型。 yii\db\Schema
getSchemaMetadata() 返回给定类型的所有表在给定 Schema 中的元数据。 yii\db\Schema
getTableMetadata() 返回给定类型在给定表的元数据。 yii\db\Schema
getTableNameParts() 将完整表名拆分为多个部分 yii\db\Schema
loadTableSchema() 加载指定表的元数据。 yii\db\Schema
normalizePdoRowKeyCase() 如果 PDO 设置为大写,则更改行的数组键大小写为小写。 yii\db\Schema
resolveTableName() 解析表名和 Schema 名(如果有)。 yii\db\Schema
setTableMetadata() 设置给定类型在给定表的元数据。 yii\db\Schema

常量

隐藏继承的常量

常量 描述 定义于
SCHEMA_CACHE_VERSION 1 Schema 缓存版本,用于检测缓存值不兼容性,当缓存数据格式发生更改时。 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

属性详细信息

隐藏继承的属性

$columnQuoteCharacter 受保护属性 (自版本 2.0.14 起可用)

用于引用列名的字符。如果起始字符和结束字符不同,则可以使用包含 2 个字符的数组。

$columnSchemaClass 公共属性 (自版本 2.0.11 起可用)

列 Schema 类或类配置

public string|array $columnSchemaClass 'yii\db\ColumnSchema'
$db 公共属性

数据库连接

public yii\db\Connection $db null
$defaultSchema 公共属性

当前会话使用的默认 Schema 名。

public string $defaultSchema null
$exceptionMap 公共属性

DB 错误和对应异常的映射 如果在 DB 错误消息中找到左侧部分,则使用右侧部分的异常类。

public array $exceptionMap = [
    
'SQLSTATE[23' => 'yii\db\IntegrityException',
]
$lastInsertID 公共属性

最后插入行的行 ID,或从序列对象检索的最后一个值。

public string $lastInsertID null
$queryBuilder 公共属性

此连接的查询构建器。

$schemaNames 公共属性

数据库中的所有 Schema 名,除了系统 Schema。

public string[] $schemaNames null
$serverVersion 公共属性

服务器版本作为字符串。

public string $serverVersion null
$tableNames 公共属性

数据库中的所有表名。

public string[] $tableNames null
$tableQuoteCharacter 受保护属性 (自版本 2.0.14 起可用)

用于引用模式、表等名称的字符。如果起始字符和结束字符不同,则可以使用包含 2 个字符的数组。

$tableSchemas 公共属性

数据库中所有表的元数据。每个数组元素都是 yii\db\TableSchema 或其子类的实例。

$transactionIsolationLevel 公共属性

此事务要使用的隔离级别。它可以是 yii\db\Transaction::READ_UNCOMMITTEDyii\db\Transaction::READ_COMMITTEDyii\db\Transaction::REPEATABLE_READyii\db\Transaction::SERIALIZABLE,但也可以是包含 DBMS 特定语法的字符串,该字符串将在 SET TRANSACTION ISOLATION LEVEL 之后使用。

方法详情

隐藏继承的方法

__call() 公共方法

定义于: yii\base\BaseObject::__call()

调用不是类方法的命名方法。

不要直接调用此方法,因为它是 PHP 魔术方法,当调用未知方法时会隐式调用它。

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()");
}

            
__construct() public method

定义于: 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();
}

            
__get() public method

定义于: 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);
}

            
__isset() public method

定义于: yii\base\BaseObject::__isset()

检查是否设置了属性,即定义且不为空。

不要直接调用此方法,因为它是一个 PHP 魔术方法,将在执行 isset($object->property) 时隐式调用。

注意,如果属性未定义,将返回 false。

另见 https://php.ac.cn/manual/en/function.isset.php.

public boolean __isset ( $name )
$name string

属性名称或事件名称

返回 boolean

命名的属性是否已设置(非 null)。

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    return false;
}

            
__set() public method

定义于: 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);
    }
}

            
__unset() public method

定义于: yii\base\BaseObject::__unset()

将对象属性设置为 null。

不要直接调用此方法,因为它是一个 PHP 魔术方法,将在执行 unset($object->property) 时隐式调用。

注意,如果属性未定义,此方法将不做任何事。如果属性是只读,它将抛出一个异常。

另见 https://php.ac.cn/manual/en/function.unset.php.

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);
    }
}

            
canGetProperty() public method

定义于: 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);
}

            
canSetProperty() public method

定义于: 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);
}

            
className() public static method
自 2.0.14 起已弃用。在 PHP >=5.5 上,使用 ::class 代替。

定义于: yii\base\BaseObject::className()

返回此类的完全限定名称。

public static string className ( )
返回 string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
convertException() public method

如果可能,将 DB 异常转换为更具体的异常。

public yii\db\Exception convertException ( Exception $e, $rawSql )
$e Exception
$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);
}

            
createColumnSchema() protected method

为数据库创建列 Schema。

此方法可能被子类覆盖以创建特定于 DBMS 的列模式。

protected yii\db\ColumnSchema createColumnSchema ( )
返回 yii\db\ColumnSchema

列模式实例。

抛出 yii\base\InvalidConfigException

如果无法创建列模式类。

                protected function createColumnSchema()
{
    return Yii::createObject($this->columnSchemaClass);
}

            
createColumnSchemaBuilder() 公共方法 (自版本 2.0.6 起可用)

创建列 Schema 构建器实例,给出类型和值精度。

子类可以重写此方法以创建特定于 DBMS 的列模式构建器。

public yii\db\ColumnSchemaBuilder createColumnSchemaBuilder ( $type, $length null )
$type string

列的类型。请参阅 yii\db\ColumnSchemaBuilder::$type

$length integer|string|array|null

列的长度或精度。请参阅 yii\db\ColumnSchemaBuilder::$length

返回 yii\db\ColumnSchemaBuilder

列模式构建器实例

                public function createColumnSchemaBuilder($type, $length = null)
{
    return Yii::createObject(ColumnSchemaBuilder::className(), [$type, $length]);
}

            
createQueryBuilder() 公共方法

为数据库创建查询构建器。

子类可以重写此方法以创建特定于 DBMS 的查询构建器。

public yii\db\QueryBuilder createQueryBuilder ( )
返回 yii\db\QueryBuilder

查询构建器实例

                public function createQueryBuilder()
{
    return Yii::createObject(QueryBuilder::className(), [$this->db]);
}

            
createSavepoint() 公共方法

创建一个新的保存点。

public void createSavepoint ( $name )
$name string

保存点名称

                public function createSavepoint($name)
{
    $this->db->createCommand("SAVEPOINT $name")->execute();
}

            
findSchemaNames() 受保护方法 (自版本 2.0.4 起可用)

返回数据库中的所有 Schema 名,包括默认 Schema,但不包括系统 Schema。

此方法应由子类重写以支持此功能,因为默认实现只是抛出异常。

protected array findSchemaNames ( )
返回 array

数据库中的所有 Schema 名,除了系统 Schema。

抛出 yii\base\NotSupportedException

如果此方法不受 DBMS 支持。

                protected function findSchemaNames()
{
    throw new NotSupportedException(get_class($this) . ' does not support fetching all schema names.');
}

            
findTableNames() 受保护方法

返回数据库中的所有表名。

此方法应由子类重写以支持此功能,因为默认实现只是抛出异常。

protected array findTableNames ( $schema '' )
$schema string

表的模式。默认为空字符串,表示当前或默认模式。

返回 array

数据库中的所有表名。这些名称没有模式名称前缀。

抛出 yii\base\NotSupportedException

如果此方法不受 DBMS 支持。

                protected function findTableNames($schema = '')
{
    throw new NotSupportedException(get_class($this) . ' does not support fetching all table names.');
}

            
findUniqueIndexes() 公共方法

返回给定表的所以唯一索引。

每个数组元素的结构如下

[
 'IndexName1' => ['col1' [, ...]],
 'IndexName2' => ['col2' [, ...]],
]

此方法应由子类重写以支持此功能,因为默认实现只是抛出异常

public array findUniqueIndexes ( $table )
$table yii\db\TableSchema

表元数据

返回 array

给定表的所有唯一索引。

抛出 yii\base\NotSupportedException

如果调用此方法

                public function findUniqueIndexes($table)
{
    throw new NotSupportedException(get_class($this) . ' does not support getting unique indexes information.');
}

            
getCacheKey() 受保护方法

返回指定表名的缓存键。

protected mixed getCacheKey ( $name )
$name string

表名。

返回 mixed

缓存键。

                protected function getCacheKey($name)
{
    return [
        __CLASS__,
        $this->db->dsn,
        $this->db->username,
        $this->getRawTableName($name),
    ];
}

            
getCacheTag() 受保护方法

返回缓存标签名。

这允许 refresh() 使所有缓存的表模式失效。

protected string getCacheTag ( )
返回 string

缓存标签名称

                protected function getCacheTag()
{
    return md5(serialize([
        __CLASS__,
        $this->db->dsn,
        $this->db->username,
    ]));
}

            
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';
}

            
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.');
}

            
getPdoType() 公共方法

确定给定 PHP 数据值的 PDO 类型。

另请参阅 https://php.ac.cn/manual/en/pdo.constants.php

public integer getPdoType ( $data )
$data mixed

要确定其 PDO 类型的 数据

返回 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;
}

            
getQueryBuilder() 公共方法

public yii\db\QueryBuilder getQueryBuilder ( )
返回 yii\db\QueryBuilder

此连接的查询构建器。

                public function getQueryBuilder()
{
    if ($this->_builder === null) {
        $this->_builder = $this->createQueryBuilder();
    }
    return $this->_builder;
}

            
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;
}

            
getSchemaMetadata() 受保护方法 (自版本 2.0.13 起可用)

返回给定类型的所有表在给定 Schema 中的元数据。

此方法将调用一个名为 'getTable' . ucfirst($type) 的方法,并使用表名和刷新标志获取元数据。

protected array getSchemaMetadata ( $schema, $type, $refresh )
$schema string

元数据的模式。默认为空字符串,表示当前或默认模式名称。

$type string

元数据类型。

$refresh boolean

是否获取最新的可用表元数据。如果为 false,则如果可用,可能会返回缓存数据。

返回 array

元数据的数组。

                protected function getSchemaMetadata($schema, $type, $refresh)
{
    $metadata = [];
    $methodName = 'getTable' . ucfirst($type);
    foreach ($this->getTableNames($schema, $refresh) as $name) {
        if ($schema !== '') {
            $name = $schema . '.' . $name;
        }
        $tableMetadata = $this->$methodName($name, $refresh);
        if ($tableMetadata !== null) {
            $metadata[] = $tableMetadata;
        }
    }
    return $metadata;
}

            
getSchemaNames() public method (available since version 2.0.4)

返回数据库中的所有 Schema 名,除了系统 Schema。

public string[] getSchemaNames ( $refresh false )
$refresh boolean

是否获取最新的可用模式名称。如果为 false,将返回之前获取的模式名称(如果可用)。

返回 string[]

数据库中的所有 Schema 名,除了系统 Schema。

                public function getSchemaNames($refresh = false)
{
    if ($this->_schemaNames === null || $refresh) {
        $this->_schemaNames = $this->findSchemaNames();
    }
    return $this->_schemaNames;
}

            
getServerVersion() public method (available since version 2.0.14)

返回一个服务器版本,作为可通过 \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;
}

            
getTableMetadata() protected method (available since version 2.0.13)

返回给定类型在给定表的元数据。

如果缓存中没有元数据,此方法将调用一个名为 'loadTable' . ucfirst($type) 的方法,并使用表名获取元数据。

protected mixed getTableMetadata ( $name, $type, $refresh )
$name string

表名。表名可能包含模式名称(如果有)。不要引用表名。

$type string

元数据类型。

$refresh boolean

是否重新加载表元数据,即使它在缓存中找到。

返回 mixed

元数据。

                protected function getTableMetadata($name, $type, $refresh)
{
    $cache = null;
    if ($this->db->enableSchemaCache && !in_array($name, $this->db->schemaCacheExclude, true)) {
        $schemaCache = is_string($this->db->schemaCache) ? Yii::$app->get($this->db->schemaCache, false) : $this->db->schemaCache;
        if ($schemaCache instanceof CacheInterface) {
            $cache = $schemaCache;
        }
    }
    $rawName = $this->getRawTableName($name);
    if (!isset($this->_tableMetadata[$rawName])) {
        $this->loadTableMetadataFromCache($cache, $rawName);
    }
    if ($refresh || !array_key_exists($type, $this->_tableMetadata[$rawName])) {
        $this->_tableMetadata[$rawName][$type] = $this->{'loadTable' . ucfirst($type)}($rawName);
        $this->saveTableMetadataToCache($cache, $rawName);
    }
    return $this->_tableMetadata[$rawName][$type];
}

            
getTableNameParts() protected method (available since version 2.0.22)

将完整表名拆分为多个部分

protected array getTableNameParts ( $name )
$name string

                protected function getTableNameParts($name)
{
    return explode('.', $name);
}

            
getTableNames() public method

返回数据库中的所有表名。

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];
}

            
getTableSchema() public method

获取指定表的元数据。

public yii\db\TableSchema|null getTableSchema ( $name, $refresh false )
$name string

表名。表名可能包含模式名称(如果有)。不要引用表名。

$refresh boolean

是否重新加载表模式,即使它在缓存中找到。

返回 yii\db\TableSchema|null

表元数据。如果名为表不存在,则为 null

                public function getTableSchema($name, $refresh = false)
{
    return $this->getTableMetadata($name, 'schema', $refresh);
}

            
getTableSchemas() public method

返回数据库中所有表的元数据。

public yii\db\TableSchema[] getTableSchemas ( $schema '', $refresh false )
$schema string

表的模式。默认为空字符串,表示当前或默认模式名称。

$refresh boolean

是否获取最新的可用表模式。如果为 false,则如果可用,可能会返回缓存数据。

返回 yii\db\TableSchema[]

数据库中所有表的元数据。每个数组元素都是 yii\db\TableSchema 或其子类的实例。

                public function getTableSchemas($schema = '', $refresh = false)
{
    return $this->getSchemaMetadata($schema, 'schema', $refresh);
}

            
hasMethod() public method

Defined in: 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);
}

            
hasProperty() public method

Defined in: 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);
}

            
init() public method

Defined in: yii\base\BaseObject::init()

初始化对象。

此方法在对象使用给定配置初始化后,在构造函数的末尾调用。

public void init ( )

                public function init()
{
}

            
insert() public method (available since version 2.0.4)

执行 INSERT 命令,返回主键值。

public array|false insert ( $table, $columns )
$table string

将插入新行的表。

$columns array

要插入到表中的列数据(名称 => 值)。

返回 array|false

主键值或如果命令失败则为 false

                public function insert($table, $columns)
{
    $command = $this->db->createCommand()->insert($table, $columns);
    if (!$command->execute()) {
        return false;
    }
    $tableSchema = $this->getTableSchema($table);
    $result = [];
    foreach ($tableSchema->primaryKey as $name) {
        if ($tableSchema->columns[$name]->autoIncrement) {
            $result[$name] = $this->getLastInsertID($tableSchema->sequenceName);
            break;
        }
        $result[$name] = isset($columns[$name]) ? $columns[$name] : $tableSchema->columns[$name]->defaultValue;
    }
    return $result;
}

            
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;
}

            
loadTableSchema() 受保护的抽象方法

加载指定表的元数据。

protected abstract yii\db\TableSchema|null loadTableSchema ( $name )
$name string

表名

返回 yii\db\TableSchema|null

DBMS 相关的表元数据,如果表不存在则为 null

                abstract protected function loadTableSchema($name);

            
normalizePdoRowKeyCase() 受保护方法 (自 2.0.13 版本起可用)

如果 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);
}

            
quoteColumnName() 公共方法

引用查询中使用的列名。

如果列名包含前缀,前缀也将被正确引用。如果列名已被引用或包含 '(', '[[' 或 '{{',则此方法将不做任何操作。

另请参见 quoteSimpleColumnName()

public string quoteColumnName ( $name )
$name string

列名

返回 string

正确引用的列名

                public function quoteColumnName($name)
{
    if (strpos($name, '(') !== false || strpos($name, '[[') !== false) {
        return $name;
    }
    if (($pos = strrpos($name, '.')) !== false) {
        $prefix = $this->quoteTableName(substr($name, 0, $pos)) . '.';
        $name = substr($name, $pos + 1);
    } else {
        $prefix = '';
    }
    if (strpos($name, '{{') !== false) {
        return $name;
    }
    return $prefix . $this->quoteSimpleColumnName($name);
}

            
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;
}

            
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;
}

            
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);
}

            
quoteValue() 公共方法

引用查询中使用的字符串值。

请注意,如果参数不是字符串,它将被原样返回。

另请参见 https://php.ac.cn/manual/en/function.PDO-quote.php

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") . "'";
}

            
refresh() 公共方法

刷新 Schema。

此方法清理所有缓存的表模式,以便以后可以重新创建它们以反映数据库模式的更改。

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 = [];
}

            
refreshTableSchema() 公共方法 (自 2.0.6 版本起可用)

刷新特定表 Schema。

此方法清理缓存的表模式,以便以后可以重新创建它们以反映数据库模式的更改。

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));
    }
}

            
releaseSavepoint() 公共方法

释放现有保存点。

public void releaseSavepoint ( $name )
$name string

保存点名称

                public function releaseSavepoint($name)
{
    $this->db->createCommand("RELEASE SAVEPOINT $name")->execute();
}

            
resolveTableName() 受保护方法 (自 2.0.13 版本起可用)

解析表名和 Schema 名(如果有)。

protected yii\db\TableSchema resolveTableName ( $name )
$name string

表名

返回 yii\db\TableSchema

yii\db\TableSchema 具有已解析的表、模式等名称。

抛出 yii\base\NotSupportedException

如果此方法不受 DBMS 支持。

                protected function resolveTableName($name)
{
    throw new NotSupportedException(get_class($this) . ' does not support resolving table names.');
}

            
rollBackSavepoint() 公共方法

回滚到先前创建的保存点。

public void rollBackSavepoint ( $name )
$name string

保存点名称

                public function rollBackSavepoint($name)
{
    $this->db->createCommand("ROLLBACK TO SAVEPOINT $name")->execute();
}

            
setTableMetadata() 受保护方法 (自 2.0.13 版本起可用)

设置给定类型在给定表的元数据。

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;
}

            
setTransactionIsolationLevel() 公共方法

设置当前事务的隔离级别。

另请参阅 https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels

public void setTransactionIsolationLevel ( $level )
$level string

此事务要使用的隔离级别。它可以是 yii\db\Transaction::READ_UNCOMMITTEDyii\db\Transaction::READ_COMMITTEDyii\db\Transaction::REPEATABLE_READyii\db\Transaction::SERIALIZABLE,但也可以是包含 DBMS 特定语法的字符串,该字符串将在 SET TRANSACTION ISOLATION LEVEL 之后使用。

                public function setTransactionIsolationLevel($level)
{
    $this->db->createCommand("SET TRANSACTION ISOLATION LEVEL $level")->execute();
}

            
supportsSavepoint() 公共方法

public boolean supportsSavepoint ( )
返回 boolean

此 DBMS 是否支持 保存点

                public function supportsSavepoint()
{
    return $this->db->enableSavepoint;
}

            
unquoteSimpleColumnName() 公共方法 (自 2.0.14 版本起可用)

取消引用简单列名。

一个简单的列名应仅包含列名,不带任何前缀。如果列名没有被引用或为星号字符'*',则此方法将不执行任何操作。

public string 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);
}

            
unquoteSimpleTableName() 公共方法 (自 2.0.14 版本起可用)

取消引用简单表名。

一个简单的表名应仅包含表名,不带任何模式前缀。如果表名没有被引用,则此方法将不执行任何操作。

public string 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);
}