columnTypes свойство (доступно начиная с версии v1.1.6)
public array $columnTypes;
отображаемые абстрактные типы столбцов в физические типы столбцов.
Подробное описание методов
addColumn() метод (доступен начиная с версии v1.1.6)
public string addColumn(string $table, string $column, string $type)
$table
string
таблица, к которой будет добавлен новый столбец. Имя таблицы будет корректно обрамлено кавычками методом.
$column
string
имя нового столбца. Имя будет корректно обрамлено кавычками методом.
$type
string
тип столбца. Метод getColumnType будет вызван для преобразования абстрактного типа столбца (если таковой имеется) в физический. Всё, что не распознаётся как абстрактный тип, будет сохранено в сгенерированном SQL. Например, 'string' будет преобразовано в 'varchar(255)', а 'string not null' станет 'varchar(255) not null'.
Создаёт SQL-запрос для добавления нового столбца БД.
alterColumn() метод (доступен начиная с версии v1.1.6)
public string alterColumn(string $table, string $column, string $type)
$table
string
таблица, столбец которой требуется изменить. Имя таблицы будет корректно обрамлено кавычками методом.
$column
string
имя столбца, который требуется изменить. Имя будет корректно обрамлено кавычками методом.
$type
string
новый тип столбца. Метод getColumnType будет вызван для преобразования абстрактного типа столбца (если таковой имеется) в физический. Всё, что не распознаётся как абстрактный тип, будет сохранено в сгенерированном SQL. Например, 'string' будет преобразовано в 'varchar(255)', а 'string not null' станет 'varchar(255) not null'.
protected function findColumns($table) { $sql=<<<EOD SELECT a.attname, LOWER(format_type(a.atttypid, a.atttypmod)) AS type, d.adsrc, a.attnotnull, a.atthasdef, pg_catalog.col_description(a.attrelid, a.attnum) AS comment FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attnum > 0 AND NOT a.attisdropped AND a.attrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname=:table AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = :schema)) ORDER BY a.attnum EOD; $command=$this->getDbConnection()->createCommand($sql); $command->bindValue(':table',$table->name); $command->bindValue(':schema',$table->schemaName);
protected function findConstraints($table) { $sql=<<<EOD SELECT conname, consrc, contype, indkey FROM ( SELECT conname, CASE WHEN contype='f' THEN pg_catalog.pg_get_constraintdef(oid) ELSE 'CHECK (' || consrc || ')' END AS consrc, contype, conrelid AS relid, NULL AS indkey FROM pg_catalog.pg_constraint WHERE contype IN ('f', 'c') UNION ALL SELECT pc.relname, NULL, CASE WHEN indisprimary THEN 'p' ELSE 'u' END, pi.indrelid, indkey FROM pg_catalog.pg_class pc, pg_catalog.pg_index pi WHERE pc.oid=pi.indexrelid AND EXISTS ( SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) WHERE d.classid = pc.tableoid AND d.objid = pc.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p') ) ) AS sub WHERE relid = (SELECT oid FROM pg_catalog.pg_class WHERE relname=:table AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname=:schema)) EOD; $command=$this->getDbConnection()->createCommand($sql); $command->bindValue(':table',$table->name); $command->bindValue(':schema',$table->schemaName); foreach($command->queryAll() as $row) { if($row['contype']==='p') // primary key $this->findPrimaryKey($table,$row['indkey']); elseif($row['contype']==='f') // foreign key $this->findForeignKey($table,$row['consrc']); } }
Сбор данных о столбцах первичного и внешнего ключей для заданной таблицы.
protected function findPrimaryKey($table,$indices) { $indices=implode(', ',preg_split('/\s+/',$indices)); $sql=<<<EOD SELECT attnum, attname FROM pg_catalog.pg_attribute WHERE attrelid=( SELECT oid FROM pg_catalog.pg_class WHERE relname=:table AND relnamespace=( SELECT oid FROM pg_catalog.pg_namespace WHERE nspname=:schema ) ) AND attnum IN ({$indices}) EOD; $command=$this->getDbConnection()->createCommand($sql); $command->bindValue(':table',$table->name); $command->bindValue(':schema',$table->schemaName); foreach($command->queryAll() as $row) { $name=$row['attname']; if(isset($table->columns[$name])) { $table->columns[$name]->isPrimaryKey=true; if($table->primaryKey===null) $table->primaryKey=$name; elseif(is_string($table->primaryKey)) $table->primaryKey=array($table->primaryKey,$name); else $table->primaryKey[]=$name; } } }
Сбор информации о первичном ключе.
findTableNames() метод
protected array findTableNames(string $schema='')
$schema
строка
схема таблиц. По умолчанию пустая строка, означающая текущую или по умолчанию схему. Если не пустая, возвращаемые имена таблиц будут иметь префикс имени схемы.
схема таблицы, последовательность первичного ключа которой будет сброшена
$value
целое число|null
значение для первичного ключа следующей новой строки. Если не установлено, первичный ключ следующей новой строки будет иметь максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).
public function resetSequence($table,$value=null) { if($table->sequenceName===null) return; $sequence='"'.$table->sequenceName.'"'; if(strpos($sequence,'.')!==false) $sequence=str_replace('.','"."',$sequence); if($value!==null) $value=(int)$value; else $value="(SELECT COALESCE(MAX(\"{$table->primaryKey}\"),0) FROM {$table->rawName})+1"; $this->getDbConnection() ->createCommand("SELECT SETVAL('$sequence',$value,false)") ->execute(); }
Сбрасывает значение последовательности первичного ключа таблицы. Последовательность будет сброшена таким образом, что первичный ключ следующей новой вставленной строки будет иметь заданное значение или максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).