абстрактные типы столбцов, сопоставленные с физическими типами столбцов.
Подробности методов
alterColumn() метод (доступно начиная с v1.1.6)
public string alterColumn(string $table, string $column, string $type)
$table
строка
имя таблицы, столбец которой необходимо изменить. Имя таблицы будет корректно обрамлено кавычками методом.
$column
строка
имя столбца, который необходимо изменить. Имя будет корректно обрамлено кавычками методом.
$type
строка
новый тип столбца. Метод getColumnType будет вызван для преобразования абстрактного типа столбца (если таковой имеется) в физический. Всё, что не распознаётся как абстрактный тип, сохранится в генерируемом SQL. Например, «строка» преобразуется в «varchar(255)», а «строка не null» — в «varchar(255) not null».
public function compareTableNames($name1,$name2) { $name1=str_replace(array('[',']'),'',$name1); $name2=str_replace(array('[',']'),'',$name2); return parent::compareTableNames(strtolower($name1),strtolower($name2)); }
Сравнивает два имени таблиц. Имена таблиц могут быть как с кавычками, так и без них. Этот метод учтёт оба случая.
protected function createCommandBuilder() { return new CMssqlCommandBuilder($this); }
Создаёт конструктор команд для базы данных. Этот метод переопределяет родительскую реализацию, чтобы создать конструктор команд, специфичный для MSSQL.
protected function findForeignKeys($table) { $rc='INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS'; $kcu='INFORMATION_SCHEMA.KEY_COLUMN_USAGE'; if (isset($table->catalogName)) { $kcu=$table->catalogName.'.'.$kcu; $rc=$table->catalogName.'.'.$rc; }
//From http://msdn2.microsoft.com/en-us/library/aa175805(SQL.80).aspx $sql = <<<EOD SELECT KCU1.CONSTRAINT_NAME AS 'FK_CONSTRAINT_NAME' , KCU1.TABLE_NAME AS 'FK_TABLE_NAME' , KCU1.COLUMN_NAME AS 'FK_COLUMN_NAME' , KCU1.ORDINAL_POSITION AS 'FK_ORDINAL_POSITION' , KCU2.CONSTRAINT_NAME AS 'UQ_CONSTRAINT_NAME' , KCU2.TABLE_NAME AS 'UQ_TABLE_NAME' , KCU2.COLUMN_NAME AS 'UQ_COLUMN_NAME' , KCU2.ORDINAL_POSITION AS 'UQ_ORDINAL_POSITION' FROM {$this->quoteTableName($rc)} RC JOIN {$this->quoteTableName($kcu)} KCU1 ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME JOIN {$this->quoteTableName($kcu)} KCU2 ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION WHERE KCU1.TABLE_NAME = :table EOD; $command = $this->getDbConnection()->createCommand($sql); $command->bindValue(':table', $table->name); $fkeys=array(); foreach($command->queryAll() as $info) { $fkeys[$info['FK_COLUMN_NAME']]=array($info['UQ_TABLE_NAME'],$info['UQ_COLUMN_NAME'],);
} return $fkeys; }
Получает ключи и имя таблицы ограничений внешних зависимостей.
protected function findPrimaryKey($table) { $kcu='INFORMATION_SCHEMA.KEY_COLUMN_USAGE'; $tc='INFORMATION_SCHEMA.TABLE_CONSTRAINTS'; if (isset($table->catalogName)) { $kcu=$table->catalogName.'.'.$kcu; $tc=$table->catalogName.'.'.$tc; }
$sql = <<<EOD SELECT k.column_name field_name FROM {$this->quoteTableName($kcu)} k LEFT JOIN {$this->quoteTableName($tc)} c ON k.table_name = c.table_name AND k.constraint_name = c.constraint_name WHERE c.constraint_type ='PRIMARY KEY' AND k.table_name = :table AND k.table_schema = :schema EOD; $command = $this->getDbConnection()->createCommand($sql); $command->bindValue(':table', $table->name); $command->bindValue(':schema', $table->schemaName); $primary=$command->queryColumn(); switch (count($primary)) { case 0: // No primary key on table $primary=null; break; case 1: // Only 1 primary key $primary=$primary[0]; break; } return $primary; }
Получает сведения о столбце(ах) первичного ключа для данной таблицы.
схема таблиц. По умолчанию пустая строка, что означает текущую или по умолчанию схему. Если не пустая, возвращаемые имена таблиц будут иметь префикс имени схемы.
$includeViews
логическое значение
включать ли представления в результат. По умолчанию true.
схема таблицы, последовательность первичного ключа которой будет сброшена
$value
целое число|null
значение для первичного ключа следующей новой вставляемой строки. Если это не установлено, первичный ключ следующей новой строки будет иметь максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).
public function resetSequence($table,$value=null) { if($table->sequenceName===null) return; if($value!==null) $value=(int)($value)-1; else $value=(int)$this->getDbConnection() ->createCommand("SELECT MAX([{$table->primaryKey}]) FROM {$table->rawName}") ->queryScalar(); $name=strtr($table->rawName,array('['=>'',']'=>'')); $this->getDbConnection() ->createCommand("DBCC CHECKIDENT ('$name',RESEED,$value)") ->execute(); }
Сбрасывает значение последовательности первичного ключа таблицы. Последовательность будет сброшена таким образом, что первичный ключ следующей новой вставляемой строки будет иметь указанное значение или максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).
protected function resolveTableNames($table,$name) { $parts=explode('.',str_replace(array('[',']'),'',$name)); if(($c=count($parts))==3) { // Catalog name, schema name and table name provided $table->catalogName=$parts[0]; $table->schemaName=$parts[1]; $table->name=$parts[2]; $table->rawName=$this->quoteTableName($table->catalogName).'.'.$this->quoteTableName($table->schemaName).'.'.$this->quoteTableName($table->name); } elseif ($c==2) { // Only schema name and table name provided $table->name=$parts[1]; $table->schemaName=$parts[0]; $table->rawName=$this->quoteTableName($table->schemaName).'.'.$this->quoteTableName($table->name); } else { // Only the name given, we need to get at least the schema name //if (empty($this->_schemaNames)) $this->findTableNames(); $table->name=$parts[0]; $table->schemaName=self::DEFAULT_SCHEMA; $table->rawName=$this->quoteTableName($table->schemaName).'.'.$this->quoteTableName($table->name); } }