0 关注者

类 yii\db\pgsql\Schema

继承关系yii\db\pgsql\Schema » yii\db\Schema » yii\base\BaseObject
实现接口yii\base\Configurable, yii\db\ConstraintFinderInterface
使用 Traitsyii\db\ConstraintFinderTrait, yii\db\ViewFinderTrait
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/db/pgsql/Schema.php

Schema 是用于从 PostgreSQL 数据库(9.x 及以上版本)检索元数据的类。

公共属性

隐藏继承属性

属性 类型 描述 定义于
$columnQuoteCharacter string|string[] 用于引用列名的字符。 yii\db\Schema
$columnSchemaClass string|array 列模式类或类配置 yii\db\pgsql\Schema
$db yii\db\Connection 数据库连接 yii\db\Schema
$defaultSchema string 当前会话使用的默认模式。 yii\db\pgsql\Schema
$exceptionMap array 数据库错误和对应异常的映射 如果在数据库错误消息中找到左侧部分,则使用右侧部分的异常类。 yii\db\Schema
$lastInsertID string 最后插入行的行 ID,或从序列对象检索到的最后一个值。 yii\db\Schema
$queryBuilder yii\db\QueryBuilder 此连接的查询构建器。 yii\db\Schema
$schemaChecks \yii\db\CheckConstraint[][] 数据库中所有表的检查约束。 yii\db\ConstraintFinderTrait
$schemaDefaultValues yii\db\DefaultValueConstraint[] 数据库中所有表的默认值约束。 yii\db\ConstraintFinderTrait
$schemaForeignKeys \yii\db\ForeignKeyConstraint[][] 数据库中所有表的外部键。 yii\db\ConstraintFinderTrait
$schemaIndexes \yii\db\IndexConstraint[][] 数据库中所有表的索引。 yii\db\ConstraintFinderTrait
$schemaNames string[] 数据库中所有模式名称,除了系统模式。 yii\db\Schema
$schemaPrimaryKeys yii\db\Constraint[] 数据库中所有表的主键。 yii\db\ConstraintFinderTrait
$schemaUniques \yii\db\IndexConstraint[][] 数据库中所有表的唯一约束。 yii\db\ConstraintFinderTrait
$serverVersion string 服务器版本作为字符串。 yii\db\Schema
$tableNames string[] 数据库中所有表名。 yii\db\Schema
$tableQuoteCharacter string|string[] 用于引用模式、表等的字符。 yii\db\pgsql\Schema
$tableSchemas yii\db\TableSchema[] 数据库中所有表的元数据。 yii\db\Schema
$transactionIsolationLevel string 此事务要使用的交易隔离级别。 yii\db\Schema
$typeMap array 物理列类型(键)到抽象列类型(值)的映射 yii\db\pgsql\Schema
$viewNames string[] 数据库中所有视图名称。 yii\db\ViewFinderTrait

受保护属性

隐藏继承属性

属性 类型 描述 定义于

公共方法

隐藏继承方法

方法 描述 定义于
__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() 如果可能,将数据库异常转换为更具体的异常。 yii\db\Schema
createColumnSchemaBuilder() 创建一个列模式构建器实例,给出类型和值精度。 yii\db\Schema
createQueryBuilder() 为 PostgreSQL 数据库创建一个查询构建器。 yii\db\pgsql\Schema
createSavepoint() 创建一个新的保存点。 yii\db\Schema
findUniqueIndexes() 返回给定表的所有唯一索引。 yii\db\pgsql\Schema
getLastInsertID() 返回最后插入行的 ID 或序列值。 yii\db\Schema
getPdoType() 确定给定 PHP 数据值的 PDO 类型。 yii\db\Schema
getQueryBuilder() yii\db\Schema
getRawTableName() 返回给定表名的实际名称。 yii\db\Schema
getSchemaChecks() 返回数据库中所有表的检查约束。 yii\db\ConstraintFinderTrait
getSchemaDefaultValues() 返回数据库中所有表的默认值约束。 yii\db\ConstraintFinderTrait
getSchemaForeignKeys() 返回数据库中所有表的外部键。 yii\db\ConstraintFinderTrait
getSchemaIndexes() 返回数据库中所有表的索引。 yii\db\ConstraintFinderTrait
getSchemaNames() 返回数据库中所有模式名称,除了系统模式。 yii\db\Schema
getSchemaPrimaryKeys() 返回数据库中所有表的主键。 yii\db\ConstraintFinderTrait
getSchemaUniques() 返回数据库中所有表的唯一约束。 yii\db\ConstraintFinderTrait
getServerVersion() 返回一个服务器版本作为字符串,可以通过 \version_compare() 进行比较。 yii\db\Schema
getTableChecks() 获取命名表的检查约束信息。 yii\db\ConstraintFinderTrait
getTableDefaultValues() 获取命名表的默认值约束信息。 yii\db\ConstraintFinderTrait
getTableForeignKeys() 获取命名表的外部键信息。 yii\db\ConstraintFinderTrait
getTableIndexes() 获取命名表的索引信息。 yii\db\ConstraintFinderTrait
getTableNames() 返回数据库中所有表名。 yii\db\Schema
getTablePrimaryKey() 获取命名表的主键。 yii\db\ConstraintFinderTrait
getTableSchema() 获取命名表的元数据。 yii\db\Schema
getTableSchemas() 返回数据库中所有表的元数据。 yii\db\Schema
getTableUniques() 获取命名表的唯一约束信息。 yii\db\ConstraintFinderTrait
getViewNames() 返回数据库中所有视图名称。 yii\db\ViewFinderTrait
hasMethod() 返回值指示方法是否已定义。 yii\base\BaseObject
hasProperty() 返回值指示属性是否已定义。 yii\base\BaseObject
init() 初始化对象。 yii\base\BaseObject
insert() 执行 INSERT 命令,返回主键值。 yii\db\pgsql\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() 刷新模式。 yii\db\Schema
refreshTableSchema() 刷新特定的表模式。 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() 为数据库创建列模式。 yii\db\Schema
findColumns() 收集表列的元数据。 yii\db\pgsql\Schema
findConstraints() 收集给定表的外部键列详细信息。 yii\db\pgsql\Schema
findSchemaNames() 返回数据库中所有模式名称,包括默认模式,但不包括系统模式。 yii\db\pgsql\Schema
findTableNames() 返回数据库中所有表名。 yii\db\pgsql\Schema
findViewNames() {@inheritdoc] yii\db\pgsql\Schema
getCacheKey() 返回指定表名的缓存键。 yii\db\Schema
getCacheTag() 返回缓存标签名称。 yii\db\Schema
getColumnPhpType() 从抽象数据库类型中提取 PHP 类型。 yii\db\Schema
getSchemaMetadata() 返回给定类型在给定模式下所有表的元数据。 yii\db\ConstraintFinderTrait
getTableMetadata() 返回给定类型在给定表的元数据。 yii\db\ConstraintFinderTrait
getTableNameParts() 将完整表名拆分为多个部分。 yii\db\Schema
getUniqueIndexInformation() 获取给定表唯一索引的信息。 yii\db\pgsql\Schema
loadColumnSchema() 将列信息加载到 yii\db\pgsql\ColumnSchema 对象中。 yii\db\pgsql\Schema
loadTableChecks() yii\db\pgsql\Schema
loadTableDefaultValues() yii\db\pgsql\Schema
loadTableForeignKeys() yii\db\pgsql\Schema
loadTableIndexes() yii\db\pgsql\Schema
loadTablePrimaryKey() yii\db\pgsql\Schema
loadTableSchema() 加载指定表的元数据。 yii\db\pgsql\Schema
loadTableUniques() yii\db\pgsql\Schema
normalizePdoRowKeyCase() 如果 PDO 的设置是大写,则将行的数组键大小写更改为小写。 yii\db\Schema
resolveTableName() 解析表名和模式名(如果有)。 yii\db\pgsql\Schema
resolveTableNames() 解析表名和模式名(如果有)。 yii\db\pgsql\Schema
setTableMetadata() 设置给定类型在给定表的元数据。 yii\db\Schema

常量

隐藏继承的常量

常量 描述 定义于
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_JSONB 'jsonb' yii\db\pgsql\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

属性详细信息

隐藏继承属性

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

列模式类或类配置

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

当前会话使用的默认模式。

public string $defaultSchema 'public'
$tableQuoteCharacter 受保护的属性 (自版本 2.0.14 起可用)

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

$typeMap 公共属性

物理列类型(键)到抽象列类型(值)的映射

另请参阅 https://postgresql.ac.cn/docs/current/datatype.html#DATATYPE-TABLE

public array $typeMap = [
    
'bit' => self::TYPE_INTEGER,
    
'bit varying' => self::TYPE_INTEGER,
    
'varbit' => self::TYPE_INTEGER,
    
'bool' => self::TYPE_BOOLEAN,
    
'boolean' => self::TYPE_BOOLEAN,
    
'box' => self::TYPE_STRING,
    
'circle' => self::TYPE_STRING,
    
'point' => self::TYPE_STRING,
    
'line' => self::TYPE_STRING,
    
'lseg' => self::TYPE_STRING,
    
'polygon' => self::TYPE_STRING,
    
'path' => self::TYPE_STRING,
    
'character' => self::TYPE_CHAR,
    
'char' => self::TYPE_CHAR,
    
'bpchar' => self::TYPE_CHAR,
    
'character varying' => self::TYPE_STRING,
    
'varchar' => self::TYPE_STRING,
    
'text' => self::TYPE_TEXT,
    
'bytea' => self::TYPE_BINARY,
    
'cidr' => self::TYPE_STRING,
    
'inet' => self::TYPE_STRING,
    
'macaddr' => self::TYPE_STRING,
    
'real' => self::TYPE_FLOAT,
    
'float4' => self::TYPE_FLOAT,
    
'double precision' => self::TYPE_DOUBLE,
    
'float8' => self::TYPE_DOUBLE,
    
'decimal' => self::TYPE_DECIMAL,
    
'numeric' => self::TYPE_DECIMAL,
    
'money' => self::TYPE_MONEY,
    
'smallint' => self::TYPE_SMALLINT,
    
'int2' => self::TYPE_SMALLINT,
    
'int4' => self::TYPE_INTEGER,
    
'int' => self::TYPE_INTEGER,
    
'integer' => self::TYPE_INTEGER,
    
'bigint' => self::TYPE_BIGINT,
    
'int8' => self::TYPE_BIGINT,
    
'oid' => self::TYPE_BIGINT,
    
'smallserial' => self::TYPE_SMALLINT,
    
'serial2' => self::TYPE_SMALLINT,
    
'serial4' => self::TYPE_INTEGER,
    
'serial' => self::TYPE_INTEGER,
    
'bigserial' => self::TYPE_BIGINT,
    
'serial8' => self::TYPE_BIGINT,
    
'pg_lsn' => self::TYPE_BIGINT,
    
'date' => self::TYPE_DATE,
    
'interval' => self::TYPE_STRING,
    
'time without time zone' => self::TYPE_TIME,
    
'time' => self::TYPE_TIME,
    
'time with time zone' => self::TYPE_TIME,
    
'timetz' => self::TYPE_TIME,
    
'timestamp without time zone' => self::TYPE_TIMESTAMP,
    
'timestamp' => self::TYPE_TIMESTAMP,
    
'timestamp with time zone' => self::TYPE_TIMESTAMP,
    
'timestamptz' => self::TYPE_TIMESTAMP,
    
'abstime' => self::TYPE_TIMESTAMP,
    
'tsquery' => self::TYPE_STRING,
    
'tsvector' => self::TYPE_STRING,
    
'txid_snapshot' => self::TYPE_STRING,
    
'unknown' => self::TYPE_STRING,
    
'uuid' => self::TYPE_STRING,
    
'json' => self::TYPE_JSON,
    
'jsonb' => self::TYPE_JSON,
    
'xml' => self::TYPE_STRING,
]

方法详细信息

隐藏继承方法

__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() 公共方法

定义于: 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() 公共方法

定义于: 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() 公共方法

定义于: 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() 公共方法

定义于: 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() 公共方法

定义于: 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() 公共方法

定义于: 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() 公共方法

定义于: 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() 公共静态方法
自 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() 公共方法

定义于: yii\db\Schema::convertException()

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

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

            
createColumnSchema() 受保护方法

定义于: yii\db\Schema::createColumnSchema()

为数据库创建列模式。

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

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

列架构实例。

抛出 yii\base\InvalidConfigException

如果无法创建列架构类。

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

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

定义于: yii\db\Schema::createColumnSchemaBuilder()

创建一个列模式构建器实例,给出类型和值精度。

子类可以重写此方法以创建特定于 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() 公共方法

为 PostgreSQL 数据库创建一个查询构建器。

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

查询构建器实例

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

            
createSavepoint() 公共方法

定义于: yii\db\Schema::createSavepoint()

创建一个新的保存点。

public void createSavepoint ( $name )
$name string

保存点名称

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

            
findColumns() 受保护方法

收集表列的元数据。

protected boolean findColumns ( $table )
$table yii\db\TableSchema

表元数据

返回值 boolean

表是否存在于数据库中

                protected function findColumns($table)
{
    $tableName = $this->db->quoteValue($table->name);
    $schemaName = $this->db->quoteValue($table->schemaName);
    $orIdentity = '';
    if (version_compare($this->db->serverVersion, '12.0', '>=')) {
        $orIdentity = 'OR attidentity != \'\'';
    }
    $sql = <<<SQL
CT
d.nspname AS table_schema,
c.relname AS table_name,
a.attname AS column_name,
COALESCE(td.typname, tb.typname, t.typname) AS data_type,
COALESCE(td.typtype, tb.typtype, t.typtype) AS type_type,
(SELECT nspname FROM pg_namespace WHERE oid = COALESCE(td.typnamespace, tb.typnamespace, t.typnamespace)) AS type_scheme,
a.attlen AS character_maximum_length,
pg_catalog.col_description(c.oid, a.attnum) AS column_comment,
a.atttypmod AS modifier,
a.attnotnull = false AS is_nullable,
CAST(pg_get_expr(ad.adbin, ad.adrelid) AS varchar) AS column_default,
coalesce(pg_get_expr(ad.adbin, ad.adrelid) ~ 'nextval',false) {$orIdentity} AS is_autoinc,
pg_get_serial_sequence(quote_ident(d.nspname) || '.' || quote_ident(c.relname), a.attname) AS sequence_name,
CASE WHEN COALESCE(td.typtype, tb.typtype, t.typtype) = 'e'::char
    THEN array_to_string((SELECT array_agg(enumlabel) FROM pg_enum WHERE enumtypid = COALESCE(td.oid, tb.oid, a.atttypid))::varchar[], ',')
    ELSE NULL
END AS enum_values,
CASE atttypid
     WHEN 21 /*int2*/ THEN 16
     WHEN 23 /*int4*/ THEN 32
     WHEN 20 /*int8*/ THEN 64
     WHEN 1700 /*numeric*/ THEN
          CASE WHEN atttypmod = -1
           THEN null
           ELSE ((atttypmod - 4) >> 16) & 65535
           END
     WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
     WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
     ELSE null
  END   AS numeric_precision,
  CASE
    WHEN atttypid IN (21, 23, 20) THEN 0
    WHEN atttypid IN (1700) THEN
    CASE
        WHEN atttypmod = -1 THEN null
        ELSE (atttypmod - 4) & 65535
    END
       ELSE null
  END AS numeric_scale,
CAST(
         information_schema._pg_char_max_length(information_schema._pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
         AS numeric
) AS size,
a.attnum = any (ct.conkey) as is_pkey,
COALESCE(NULLIF(a.attndims, 0), NULLIF(t.typndims, 0), (t.typcategory='A')::int) AS dimension

pg_class c
LEFT JOIN pg_attribute a ON a.attrelid = c.oid
LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
LEFT JOIN pg_type t ON a.atttypid = t.oid
LEFT JOIN pg_type tb ON (a.attndims > 0 OR t.typcategory='A') AND t.typelem > 0 AND t.typelem = tb.oid OR t.typbasetype > 0 AND t.typbasetype = tb.oid
LEFT JOIN pg_type td ON t.typndims > 0 AND t.typbasetype > 0 AND tb.typelem = td.oid
LEFT JOIN pg_namespace d ON d.oid = c.relnamespace
LEFT JOIN pg_constraint ct ON ct.conrelid = c.oid AND ct.contype = 'p'
E
a.attnum > 0 AND t.typname != '' AND NOT a.attisdropped
AND c.relname = {$tableName}
AND d.nspname = {$schemaName}
R BY
a.attnum;

    $columns = $this->db->createCommand($sql)->queryAll();
    if (empty($columns)) {
        return false;
    }
    foreach ($columns as $column) {
        if ($this->db->slavePdo->getAttribute(\PDO::ATTR_CASE) === \PDO::CASE_UPPER) {
            $column = array_change_key_case($column, CASE_LOWER);
        }
        $column = $this->loadColumnSchema($column);
        $table->columns[$column->name] = $column;
        if ($column->isPrimaryKey) {
            $table->primaryKey[] = $column->name;
            if ($table->sequenceName === null) {
                $table->sequenceName = $column->sequenceName;
            }
            $column->defaultValue = null;
        } elseif ($column->defaultValue) {
            if (
                in_array($column->type, [self::TYPE_TIMESTAMP, self::TYPE_DATE, self::TYPE_TIME], true) &&
                in_array(
                    strtoupper($column->defaultValue),
                    ['NOW()', 'CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME'],
                    true
                )
            ) {
                $column->defaultValue = new Expression($column->defaultValue);
            } elseif ($column->type === 'boolean') {
                $column->defaultValue = ($column->defaultValue === 'true');
            } elseif (preg_match("/^B'(.*?)'::/", $column->defaultValue, $matches)) {
                $column->defaultValue = bindec($matches[1]);
            } elseif (preg_match("/^'(\d+)'::\"bit\"$/", $column->defaultValue, $matches)) {
                $column->defaultValue = bindec($matches[1]);
            } elseif (preg_match("/^'(.*?)'::/", $column->defaultValue, $matches)) {
                $column->defaultValue = $column->phpTypecast($matches[1]);
            } elseif (preg_match('/^(\()?(.*?)(?(1)\))(?:::.+)?$/', $column->defaultValue, $matches)) {
                if ($matches[2] === 'NULL') {
                    $column->defaultValue = null;
                } else {
                    $column->defaultValue = $column->phpTypecast($matches[2]);
                }
            } else {
                $column->defaultValue = $column->phpTypecast($column->defaultValue);
            }
        }
    }
    return true;
}

            
findConstraints() 受保护方法

收集给定表的外部键列详细信息。

protected void findConstraints ( $table )
$table yii\db\TableSchema

表元数据

                protected function findConstraints($table)
{
    $tableName = $this->quoteValue($table->name);
    $tableSchema = $this->quoteValue($table->schemaName);
    //We need to extract the constraints de hard way since:
    //https://postgresql.ac.cn/message-id/[email protected]
    $sql = <<<SQL
ct
ct.conname as constraint_name,
a.attname as column_name,
fc.relname as foreign_table_name,
fns.nspname as foreign_table_schema,
fa.attname as foreign_column_name

(SELECT ct.conname, ct.conrelid, ct.confrelid, ct.conkey, ct.contype, ct.confkey, generate_subscripts(ct.conkey, 1) AS s
   FROM pg_constraint ct
) AS ct
inner join pg_class c on c.oid=ct.conrelid
inner join pg_namespace ns on c.relnamespace=ns.oid
inner join pg_attribute a on a.attrelid=ct.conrelid and a.attnum = ct.conkey[ct.s]
left join pg_class fc on fc.oid=ct.confrelid
left join pg_namespace fns on fc.relnamespace=fns.oid
left join pg_attribute fa on fa.attrelid=ct.confrelid and fa.attnum = ct.confkey[ct.s]
e
ct.contype='f'
and c.relname={$tableName}
and ns.nspname={$tableSchema}
r by
fns.nspname, fc.relname, a.attnum

    $constraints = [];
    foreach ($this->db->createCommand($sql)->queryAll() as $constraint) {
        if ($this->db->slavePdo->getAttribute(\PDO::ATTR_CASE) === \PDO::CASE_UPPER) {
            $constraint = array_change_key_case($constraint, CASE_LOWER);
        }
        if ($constraint['foreign_table_schema'] !== $this->defaultSchema) {
            $foreignTable = $constraint['foreign_table_schema'] . '.' . $constraint['foreign_table_name'];
        } else {
            $foreignTable = $constraint['foreign_table_name'];
        }
        $name = $constraint['constraint_name'];
        if (!isset($constraints[$name])) {
            $constraints[$name] = [
                'tableName' => $foreignTable,
                'columns' => [],
            ];
        }
        $constraints[$name]['columns'][$constraint['column_name']] = $constraint['foreign_column_name'];
    }
    foreach ($constraints as $name => $constraint) {
        $table->foreignKeys[$name] = array_merge([$constraint['tableName']], $constraint['columns']);
    }
}

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

返回数据库中所有模式名称,包括默认模式,但不包括系统模式。

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

protected array findSchemaNames ( )
返回值 array

数据库中所有模式名称,除了系统模式。

抛出 yii\base\NotSupportedException

如果此方法不受 DBMS 支持。

                protected function findSchemaNames()
{
    static $sql = <<<'SQL'
CT "ns"."nspname"
 "pg_namespace" AS "ns"
E "ns"."nspname" != 'information_schema' AND "ns"."nspname" NOT LIKE 'pg_%'
R BY "ns"."nspname" ASC

    return $this->db->createCommand($sql)->queryColumn();
}

            
findTableNames() 受保护方法

返回数据库中所有表名。

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

受保护 数组 findTableNames ( $schema '' )
$schema string

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

返回值 array

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

抛出 yii\base\NotSupportedException

如果此方法不受 DBMS 支持。

                protected function findTableNames($schema = '')
{
    if ($schema === '') {
        $schema = $this->defaultSchema;
    }
    $sql = <<<'SQL'
CT c.relname AS table_name
 pg_class c
R JOIN pg_namespace ns ON ns.oid = c.relnamespace
E ns.nspname = :schemaName AND c.relkind IN ('r','v','m','f', 'p')
R BY c.relname

    return $this->db->createCommand($sql, [':schemaName' => $schema])->queryColumn();
}

            
findUniqueIndexes() 公共方法

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

每个数组元素具有以下结构

[
    'IndexName1' => ['col1' [, ...]],
    'IndexName2' => ['col2' [, ...]],
]
公共 数组 findUniqueIndexes ( $table )
$table yii\db\TableSchema

表元数据

返回值 array

给定表的全部唯一索引。

                public function findUniqueIndexes($table)
{
    $uniqueIndexes = [];
    foreach ($this->getUniqueIndexInformation($table) as $row) {
        if ($this->db->slavePdo->getAttribute(\PDO::ATTR_CASE) === \PDO::CASE_UPPER) {
            $row = array_change_key_case($row, CASE_LOWER);
        }
        $column = $row['columnname'];
        if (strncmp($column, '"', 1) === 0) {
            // postgres will quote names that are not lowercase-only
            // https://github.com/yiisoft/yii2/issues/10613
            $column = substr($column, 1, -1);
        }
        $uniqueIndexes[$row['indexname']][] = $column;
    }
    return $uniqueIndexes;
}

            
findViewNames() 受保护方法

{@inheritdoc]

受保护 findViewNames ( $schema '' )
$schema

                protected function findViewNames($schema = '')
{
    if ($schema === '') {
        $schema = $this->defaultSchema;
    }
    $sql = <<<'SQL'
CT c.relname AS table_name
 pg_class c
R JOIN pg_namespace ns ON ns.oid = c.relnamespace
E ns.nspname = :schemaName AND (c.relkind = 'v' OR c.relkind = 'm')
R BY c.relname

    return $this->db->createCommand($sql, [':schemaName' => $schema])->queryColumn();
}

            
getCacheKey() 受保护方法

定义于: yii\db\Schema::getCacheKey()

返回指定表名的缓存键。

受保护 混合 getCacheKey ( $name )
$name string

表名。

返回值 mixed

缓存键。

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

            
getCacheTag() 受保护方法

定义于: yii\db\Schema::getCacheTag()

返回缓存标签名称。

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

受保护 字符串 getCacheTag ( )
返回值 string

缓存标签名称

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

            
getColumnPhpType() 受保护方法

定义于: yii\db\Schema::getColumnPhpType()

从抽象数据库类型中提取 PHP 类型。

受保护 字符串 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() 公共方法

定义于: yii\db\Schema::getLastInsertID()

返回最后插入行的 ID 或序列值。

另请参阅 https://php.ac.cn/manual/en/function.PDO-lastInsertId.php

公共 字符串 getLastInsertID ( $sequenceName '' )
$sequenceName string

序列对象的名称(某些 DBMS 需要)

返回值 string

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

抛出 yii\base\InvalidCallException

如果数据库连接未激活

                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() 公共方法

定义于: yii\db\Schema::getPdoType()

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

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

公共 整数 getPdoType ( $data )
$data mixed

要确定其 PDO 类型的的数据

返回值 整数

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() 公共方法
公共 yii\db\QueryBuilder getQueryBuilder ( )
返回值 yii\db\QueryBuilder

此连接的查询构建器。

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

            
getRawTableName() 公共方法

定义于: yii\db\Schema::getRawTableName()

返回给定表名的实际名称。

此方法将剥离给定表名中的花括号,并将百分号“%”替换为 yii\db\Connection::$tablePrefix

公共 字符串 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;
}

            
getSchemaChecks() 公共方法

定义于: yii\db\ConstraintFinderTrait::getSchemaChecks()

返回数据库中所有表的检查约束。

公共 \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);
}

            
getSchemaDefaultValues() 公共方法

定义于: yii\db\ConstraintFinderTrait::getSchemaDefaultValues()

返回数据库中所有表的默认值约束。

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

            
getSchemaForeignKeys() 公共方法

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

            
getSchemaIndexes() 公共方法

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

            
getSchemaMetadata() 受保护的抽象方法

定义于: yii\db\ConstraintFinderTrait::getSchemaMetadata()

返回给定类型在给定模式下所有表的元数据。

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

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

$type string

元数据类型。

$refresh boolean

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

返回值 array

元数据的数组。

                abstract protected function getSchemaMetadata($schema, $type, $refresh);

            
getSchemaNames() 公共方法 (自版本 2.0.4 起可用)

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

            
getSchemaPrimaryKeys() 公共方法

定义于: yii\db\ConstraintFinderTrait::getSchemaPrimaryKeys()

返回数据库中所有表的主键。

public yii\db\Constraint[] getSchemaPrimaryKeys ( $schema '', $refresh false )
$schema string

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

$refresh boolean

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

返回值 yii\db\Constraint[]

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

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

            
getSchemaUniques() 公共方法

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

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

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

            
getTableChecks() 公共方法

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

            
getTableDefaultValues() 公共方法

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

            
getTableForeignKeys() 公共方法

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

            
getTableIndexes() 公共方法

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

            
getTableMetadata() 受保护的抽象方法

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

            
getTableNameParts() 受保护的方法 (自版本 2.0.22 起可用)

定义于: yii\db\Schema::getTableNameParts()

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

protected array getTableNameParts ( $name )
$name string

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

            
getTableNames() 公共方法

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

            
getTablePrimaryKey() 公共方法

定义于: yii\db\ConstraintFinderTrait::getTablePrimaryKey()

获取命名表的主键。

public yii\db\Constraint|null getTablePrimaryKey ( $name, $refresh false )
$name string

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

$refresh boolean

即使在缓存中找到信息,是否重新加载信息。

返回值 yii\db\Constraint|null

表主键,如果表没有主键,则为 null

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

            
getTableSchema() 公共方法

定义于: yii\db\Schema::getTableSchema()

获取命名表的元数据。

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() 公共方法

定义于: yii\db\Schema::getTableSchemas()

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

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

            
getTableUniques() 公共方法

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

            
getUniqueIndexInformation() 受保护的方法

获取给定表唯一索引的信息。

protected array getUniqueIndexInformation ( $table )
$table yii\db\TableSchema

表元数据

返回值 array

带有索引和列名

                protected function getUniqueIndexInformation($table)
{
    $sql = <<<'SQL'
CT
i.relname as indexname,
pg_get_indexdef(idx.indexrelid, k + 1, TRUE) AS columnname
 (
LECT *, generate_subscripts(indkey, 1) AS k
OM pg_index
x
R JOIN pg_class i ON i.oid = idx.indexrelid
R JOIN pg_class c ON c.oid = idx.indrelid
R JOIN pg_namespace ns ON c.relnamespace = ns.oid
E idx.indisprimary = FALSE AND idx.indisunique = TRUE
c.relname = :tableName AND ns.nspname = :schemaName
R BY i.relname, k

    return $this->db->createCommand($sql, [
        ':schemaName' => $table->schemaName,
        ':tableName' => $table->name,
    ])->queryAll();
}

            
getViewNames() 公共方法

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

            
hasMethod() 公共方法

定义于: 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() 公共方法

定义于: 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() 公共方法

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

初始化对象。

此方法在构造函数结束后被调用,此时对象已使用给定的配置进行初始化。

public void init ( )

                public function init()
{
}

            
insert() 公共方法 (自版本 2.0.4 起可用)

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

public 数组|布尔值 insert ( $table, $columns )
$table string

将要插入新行的表。

$columns array

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

返回值 数组|布尔值

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

                public function insert($table, $columns)
{
    $params = [];
    $sql = $this->db->getQueryBuilder()->insert($table, $columns, $params);
    $returnColumns = $this->getTableSchema($table)->primaryKey;
    if (!empty($returnColumns)) {
        $returning = [];
        foreach ((array) $returnColumns as $name) {
            $returning[] = $this->quoteColumnName($name);
        }
        $sql .= ' RETURNING ' . implode(', ', $returning);
    }
    $command = $this->db->createCommand($sql, $params);
    $command->prepare(false);
    $result = $command->queryOne();
    return !$command->pdoStatement->rowCount() ? false : $result;
}

            
isReadQuery() 公共方法

定义于: yii\db\Schema::isReadQuery()

返回值指示 SQL 语句是否用于读取目的。

public 布尔值 isReadQuery ( $sql )
$sql string

SQL 语句

返回值 boolean

SQL 语句是否用于读取目的。

                public function isReadQuery($sql)
{
    $pattern = '/^\s*(SELECT|SHOW|DESCRIBE)\b/i';
    return preg_match($pattern, $sql) > 0;
}

            
loadColumnSchema() 受保护方法

将列信息加载到 yii\db\pgsql\ColumnSchema 对象中。

protected yii\db\pgsql\ColumnSchema loadColumnSchema ( $info )
$info array

列信息

返回值 yii\db\pgsql\ColumnSchema

列模式对象

                protected function loadColumnSchema($info)
{
    /** @var ColumnSchema $column */
    $column = $this->createColumnSchema();
    $column->allowNull = $info['is_nullable'];
    $column->autoIncrement = $info['is_autoinc'];
    $column->comment = $info['column_comment'];
    if ($info['type_scheme'] !== null && !in_array($info['type_scheme'], [$this->defaultSchema, 'pg_catalog'], true)) {
        $column->dbType = $info['type_scheme'] . '.' . $info['data_type'];
    } else {
        $column->dbType = $info['data_type'];
    }
    $column->defaultValue = $info['column_default'];
    $column->enumValues = ($info['enum_values'] !== null) ? explode(',', str_replace(["''"], ["'"], $info['enum_values'])) : null;
    $column->unsigned = false; // has no meaning in PG
    $column->isPrimaryKey = $info['is_pkey'];
    $column->name = $info['column_name'];
    $column->precision = $info['numeric_precision'];
    $column->scale = $info['numeric_scale'];
    $column->size = $info['size'] === null ? null : (int) $info['size'];
    $column->dimension = (int) $info['dimension'];
    // pg_get_serial_sequence() doesn't track DEFAULT value change. GENERATED BY IDENTITY columns always have null default value
    if (isset($column->defaultValue) && preg_match("/nextval\\('\"?\\w+\"?\.?\"?\\w+\"?'(::regclass)?\\)/", $column->defaultValue) === 1) {
        $column->sequenceName = preg_replace(['/nextval/', '/::/', '/regclass/', '/\'\)/', '/\(\'/'], '', $column->defaultValue);
    } elseif (isset($info['sequence_name'])) {
        $column->sequenceName = $this->resolveTableName($info['sequence_name'])->fullName;
    }
    if (isset($this->typeMap[$column->dbType])) {
        $column->type = $this->typeMap[$column->dbType];
    } else {
        $column->type = self::TYPE_STRING;
    }
    $column->phpType = $this->getColumnPhpType($column);
    return $column;
}

            
loadTableChecks() 受保护方法

protected void loadTableChecks ( $tableName )
$tableName

                protected function loadTableChecks($tableName)
{
    return $this->loadTableConstraints($tableName, 'checks');
}

            
loadTableDefaultValues() 受保护方法

protected void loadTableDefaultValues ( $tableName )
$tableName
抛出 yii\base\NotSupportedException

如果调用此方法。

                protected function loadTableDefaultValues($tableName)
{
    throw new NotSupportedException('PostgreSQL does not support default value constraints.');
}

            
loadTableForeignKeys() 受保护方法

protected void loadTableForeignKeys ( $tableName )
$tableName

                protected function loadTableForeignKeys($tableName)
{
    return $this->loadTableConstraints($tableName, 'foreignKeys');
}

            
loadTableIndexes() 受保护方法

protected void loadTableIndexes ( $tableName )
$tableName

                protected function loadTableIndexes($tableName)
{
    static $sql = <<<'SQL'
CT
"ic"."relname" AS "name",
"ia"."attname" AS "column_name",
"i"."indisunique" AS "index_is_unique",
"i"."indisprimary" AS "index_is_primary"
 "pg_class" AS "tc"
R JOIN "pg_namespace" AS "tcns"
ON "tcns"."oid" = "tc"."relnamespace"
R JOIN "pg_index" AS "i"
ON "i"."indrelid" = "tc"."oid"
R JOIN "pg_class" AS "ic"
ON "ic"."oid" = "i"."indexrelid"
R JOIN "pg_attribute" AS "ia"
ON "ia"."attrelid" = "i"."indexrelid"
E "tcns"."nspname" = :schemaName AND "tc"."relname" = :tableName
R BY "ia"."attnum" ASC

    $resolvedName = $this->resolveTableName($tableName);
    $indexes = $this->db->createCommand($sql, [
        ':schemaName' => $resolvedName->schemaName,
        ':tableName' => $resolvedName->name,
    ])->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;
}

            
loadTablePrimaryKey() 受保护方法

protected void loadTablePrimaryKey ( $tableName )
$tableName

                protected function loadTablePrimaryKey($tableName)
{
    return $this->loadTableConstraints($tableName, 'primaryKey');
}

            
loadTableSchema() 受保护方法

加载指定表的元数据。

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

表名

返回值 yii\db\TableSchema|null

依赖于 DBMS 的表元数据,如果表不存在则为 null

                protected function loadTableSchema($name)
{
    $table = new TableSchema();
    $this->resolveTableNames($table, $name);
    if ($this->findColumns($table)) {
        $this->findConstraints($table);
        return $table;
    }
    return null;
}

            
loadTableUniques() 受保护方法

protected void loadTableUniques ( $tableName )
$tableName

                protected function loadTableUniques($tableName)
{
    return $this->loadTableConstraints($tableName, 'uniques');
}

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

定义于: yii\db\Schema::normalizePdoRowKeyCase()

如果 PDO 的设置是大写,则将行的数组键大小写更改为小写。

protected 数组 normalizePdoRowKeyCase ( 数组 $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() 公共方法

定义于: yii\db\Schema::quoteColumnName()

引用列名以在查询中使用。

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

另请参阅 quoteSimpleColumnName()

public 字符串 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() 公共方法

定义于: yii\db\Schema::quoteSimpleColumnName()

引用简单列名以在查询中使用。

简单的列名应仅包含列名,不包含任何前缀。如果列名已引用或为星号字符 '*',则此方法将不做任何操作。

public 字符串 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() 公共方法

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

            
quoteTableName() 公共方法

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

            
quoteValue() 公共方法

定义于: yii\db\Schema::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() 公共方法

定义于: yii\db\Schema::refresh()

刷新模式。

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

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 起可用)

定义于: yii\db\Schema::refreshTableSchema()

刷新特定的表模式。

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

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() 公共方法

定义于: yii\db\Schema::releaseSavepoint()

释放现有的保存点。

public void releaseSavepoint ( $name )
$name string

保存点名称

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

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

解析表名和模式名(如果有)。

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

表名

返回值 yii\db\TableSchema

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

抛出 yii\base\NotSupportedException

如果此方法不受 DBMS 支持。

                protected function resolveTableName($name)
{
    $resolvedName = new TableSchema();
    $parts = explode('.', str_replace('"', '', $name));
    if (isset($parts[1])) {
        $resolvedName->schemaName = $parts[0];
        $resolvedName->name = $parts[1];
    } else {
        $resolvedName->schemaName = $this->defaultSchema;
        $resolvedName->name = $name;
    }
    $resolvedName->fullName = ($resolvedName->schemaName !== $this->defaultSchema ? $resolvedName->schemaName . '.' : '') . $resolvedName->name;
    return $resolvedName;
}

            
resolveTableNames() 受保护的方法

解析表名和模式名(如果有)。

protected void resolveTableNames ( $table, $name )
$table yii\db\TableSchema

表元数据对象

$name string

表名

                protected function resolveTableNames($table, $name)
{
    $parts = explode('.', str_replace('"', '', $name));
    if (isset($parts[1])) {
        $table->schemaName = $parts[0];
        $table->name = $parts[1];
    } else {
        $table->schemaName = $this->defaultSchema;
        $table->name = $parts[0];
    }
    $table->fullName = $table->schemaName !== $this->defaultSchema ? $table->schemaName . '.' . $table->name : $table->name;
}

            
rollBackSavepoint() 公共方法

定义于: yii\db\Schema::rollBackSavepoint()

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

public void rollBackSavepoint ( $name )
$name string

保存点名称

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

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

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

            
setTransactionIsolationLevel() 公共方法
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 起可用)

定义于: yii\db\Schema::unquoteSimpleColumnName()

去除简单列名的引号。

简单的列名应该只包含列名,不包含任何前缀。如果列名未被引用或为星号字符 '*',则此方法将不做任何操作。

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 起可用)

定义于: yii\db\Schema::unquoteSimpleTableName()

去除简单表名的引号。

简单的表名应该只包含表名,不包含任何模式前缀。如果表名没有加引号,此方法将不做任何操作。

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