クラス yii\db\pgsql\Schema
Schemaは、PostgreSQLデータベース(バージョン9.x以上)からメタデータを取得するためのクラスです。
公開プロパティ
公開メソッド
保護されたメソッド
定数
定数 | 値 | 説明 | 定義元 |
---|---|---|---|
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 |
プロパティの詳細
列スキーマクラスまたはクラス設定
スキーマ、テーブルなどの名前を引用符で囲むために使用される文字。開始文字と終了文字が異なる場合は、2文字の配列を使用できます。
物理的な列の種類(キー)から抽象的な列の種類(値)へのマッピング
こちらも参照してください https://www.postgresql.org/docs/current/datatype.html#DATATYPE-TABLE.
'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,
]
メソッドの詳細
定義場所: 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()");
}
定義場所: yii\base\BaseObject::__construct()
コンストラクタ。
デフォルトの実装では、次の2つのことを行います。
- 指定された設定
$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()
プロパティが設定されているかどうか(つまり、定義されていてnullではないかどうか)を確認します。
これはPHPのマジックメソッドであり、`isset($object->property)`を実行した際に暗黙的に呼び出されるため、直接呼び出さないでください。
プロパティが定義されていない場合、falseが返されることに注意してください。
こちらも参照してください https://www.php.net/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;
}
定義位置: 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)`を実行した際に暗黙的に呼び出されるため、直接呼び出さないでください。
プロパティが定義されていない場合、このメソッドは何もしません。プロパティが読み取り専用の場合、例外がスローされます。
こちらも参照してください https://www.php.net/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);
}
}
定義位置: yii\base\BaseObject::canGetProperty()
プロパティを読み取ることができるかどうかを示す値を返します。
プロパティは、以下の場合に読み取り可能です。
- クラスに、指定された名前と関連付けられたゲッターメソッドがある場合(この場合、プロパティ名は大小文字を区別しません)。
- クラスに、指定された名前のメンバ変数がある場合(`$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()
プロパティを設定できるかどうかを示す値を返します。
プロパティは、以下の場合に書き込み可能です。
- クラスに、指定された名前と関連付けられたセッターメソッドがある場合(この場合、プロパティ名は大小文字を区別しません)。
- クラスに、指定された名前のメンバ変数がある場合(`$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);
}
定義位置: 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 | 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);
}
定義位置: yii\db\Schema::createColumnSchema()
データベースの列スキーマを作成します。
このメソッドは、DBMS固有の列スキーマを作成するために、子クラスでオーバーライドできます。
protected yii\db\ColumnSchema createColumnSchema ( ) | ||
戻り値 | yii\db\ColumnSchema |
列スキーマインスタンス。 |
---|---|---|
例外 | yii\base\InvalidConfigException |
列スキーマクラスを作成できない場合。 |
protected function createColumnSchema()
{
return Yii::createObject($this->columnSchemaClass);
}
定義位置: 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]);
}
PostgreSQLデータベースのクエリビルダーを作成します。
public yii\db\pgsql\QueryBuilder createQueryBuilder ( ) | ||
戻り値 | yii\db\pgsql\QueryBuilder |
クエリビルダーインスタンス |
---|
public function createQueryBuilder()
{
return Yii::createObject(QueryBuilder::className(), [$this->db]);
}
定義位置: yii\db\Schema::createSavepoint()
新しいセーブポイントを作成します。
public void createSavepoint ( $name ) | ||
$name | string |
セーブポイント名 |
public function createSavepoint($name)
{
$this->db->createCommand("SAVEPOINT $name")->execute();
}
テーブル列のメタデータを取得します。
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;
}
指定されたテーブルの外部キー列の詳細を取得します。
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://www.postgresql.org/message-id/26677.1086673982@sss.pgh.pa.us
$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']);
}
}
データベース内のすべてのスキーマ名(デフォルトのスキーマを含むが、システムスキーマは除く)を返します。
この機能をサポートするために、子クラスでこのメソッドをオーバーライドする必要があります。デフォルトの実装では単に例外をスローします。
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();
}
データベース内のすべてのテーブル名を返します。
この機能をサポートするために、子クラスでこのメソッドをオーバーライドする必要があります。デフォルトの実装では単に例外をスローします。
protected array 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();
}
指定されたテーブルのすべての一意インデックスを返します。
各配列要素は次の構造です。
[
'IndexName1' => ['col1' [, ...]],
'IndexName2' => ['col2' [, ...]],
]
public array 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;
}
{@inheritdoc}
protected void 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();
}
定義されている場所: 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),
];
}
定義されている場所: yii\db\Schema::getCacheTag()
キャッシュタグ名を返します。
これにより、refresh() は、キャッシュされたすべてのテーブルスキーマを無効にすることができます。
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://www.php.net/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型を決定します。
こちらも参照してください https://www.php.net/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;
}
定義されている場所: yii\db\Schema::getQueryBuilder()
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);
}
定義位置: yii\db\ConstraintFinderTrait::getSchemaMetadata()
指定されたスキーマ内のすべてのテーブルについて、指定された型のメタデータを返します。
protected abstract array getSchemaMetadata ( $schema, $type, $refresh ) | ||
$schema | string |
メタデータのスキーマ。デフォルトは空文字列で、現在のスキーマ名またはデフォルトのスキーマ名を意味します。 |
$type | string |
メタデータの種類。 |
$refresh | boolean |
最新のテーブルメタデータを取得するかどうか。これが |
戻り値 | array |
メタデータの配列。 |
---|
abstract protected function getSchemaMetadata($schema, $type, $refresh);
定義位置: 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()
データベース内のすべてのテーブルの主キーを返します。
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);
定義位置: yii\db\Schema::getTableNameParts()
完全なテーブル名を複数の部分に分割します。
protected array getTableNameParts ( $name ) | ||
$name | string |
protected function getTableNameParts($name)
{
return explode('.', $name);
}
定義位置: 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);
}
指定されたテーブルの一意インデックスに関する情報を取得します。
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();
}
定義位置: 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()
プロパティが定義されているかどうかを示す値を返します。
プロパティは、以下の場合に定義されます。
- クラスが指定された名前に関連付けられたゲッターまたはセッターメソッドを持つ場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに、指定された名前のメンバ変数がある場合(`$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()
{
}
INSERT コマンドを実行し、主キーの値を返します。
public array|false insert ( $table, $columns ) | ||
$table | string |
新しい行が挿入されるテーブル。 |
$columns | array |
テーブルに挿入される列データ(name => value)。 |
戻り値 | array|false |
主キーの値、またはコマンドが失敗した場合は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;
}
定義位置: 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\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;
}
protected void loadTableChecks ( $tableName ) | ||
$tableName |
protected function loadTableChecks($tableName)
{
return $this->loadTableConstraints($tableName, 'checks');
}
protected void loadTableDefaultValues ( $tableName ) | ||
$tableName | ||
例外 | yii\base\NotSupportedException |
このメソッドが呼び出された場合。 |
---|
protected function loadTableDefaultValues($tableName)
{
throw new NotSupportedException('PostgreSQL does not support default value constraints.');
}
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
"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;
}
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依存のテーブルメタデータ。テーブルが存在しない場合は`null`。 |
---|
protected function loadTableSchema($name)
{
$table = new TableSchema();
$this->resolveTableNames($table, $name);
if ($this->findColumns($table)) {
$this->findConstraints($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);
}
定義場所: yii\db\Schema::quoteColumnName()
クエリで使用するための列名を引用符で囲みます。
カラム名にプレフィックスが含まれる場合、プレフィックスも適切に引用符で囲まれます。カラム名が既に引用符で囲まれているか、'('、'[[‘、または'{{'が含まれる場合は、このメソッドは何もしません。
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);
}
定義場所: 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()
クエリで使用するためのテーブル名を引用符で囲みます。
テーブル名にスキーマプレフィックスが含まれる場合、プレフィックスも適切に引用符で囲まれます。テーブル名が既に引用符で囲まれているか、'('または'{{'が含まれる場合は、このメソッドは何もしません。
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") . "'";
}
定義場所: 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 = [];
}
定義場所: 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));
}
}
定義場所: yii\db\Schema::releaseSavepoint()
既存のセーブポイントを解放します。
public void releaseSavepoint ( $name ) | ||
$name | string |
セーブポイント名 |
public function releaseSavepoint($name)
{
$this->db->createCommand("RELEASE SAVEPOINT $name")->execute();
}
テーブル名とスキーマ名(存在する場合)を解決します。
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;
}
テーブル名とスキーマ名(存在する場合)を解決します。
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;
}
定義済み場所: yii\db\Schema::rollBackSavepoint()
以前に作成されたセーブポイントにロールバックします。
public void rollBackSavepoint ( $name ) | ||
$name | string |
セーブポイント名 |
public function rollBackSavepoint($name)
{
$this->db->createCommand("ROLLBACK TO SAVEPOINT $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 のいずれか、または`SET TRANSACTION ISOLATION LEVEL`の後に使用される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()
単純な列名の引用符を削除します。
単純な列名は、プレフィックスなしの列名のみを含む必要があります。列名が引用符で囲まれていない場合、またはアスタリスク文字 '*' の場合、このメソッドは何もしません。
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);
}
定義済み場所: 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);
}
サインアップ または ログイン してコメントしてください。