/** * generates create table query for pgsql * @param Table $table * @return array list of queries */ public function createTable(Table $table) { $queries = []; $primaryKeys = $table->getPrimaryColumns(); $enumSetColumns = []; foreach ($table->getColumns() as $column) { if (in_array($column->getType(), [Column::TYPE_ENUM, Column::TYPE_SET])) { $enumSetColumns[] = $column; } } if (!empty($enumSetColumns)) { foreach ($enumSetColumns as $column) { $queries[] = 'CREATE TYPE ' . $this->escapeString($table->getName() . '__' . $column->getName()) . ' AS ENUM (' . implode(',', array_map(function ($value) { return "'{$value}'"; }, $column->getValues())) . ');'; } } $autoincrement = false; foreach ($primaryKeys as $primaryKey) { $primaryKeyColumn = $table->getColumn($primaryKey); if ($primaryKeyColumn->isAutoincrement()) { $autoincrement = true; break; } } if ($autoincrement) { $queries[] = 'CREATE SEQUENCE ' . $this->escapeString($table->getName() . '_seq') . ';'; } $queries[] = $this->createTableQuery($table); foreach ($table->getIndexes() as $index) { $queries[] = $this->createIndex($index, $table); } return $queries; }
private function createIndex(Index $index, Table $table) { $columns = []; foreach ($index->getColumns() as $column) { $columns[] = $this->escapeString($table->getColumn($column)->getName()); } $query = 'CREATE ' . $index->getType() . ' ' . $this->escapeString($index->getName()) . ' ON ' . $this->escapeString($table->getName()) . ' (' . implode(',', $columns) . ');'; return $query; }
public function testGetters() { $table = new Table('test'); $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Table', $table->addColumn(new Column('title', 'string'))); $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Table', $table->addColumn(new Column('total', 'int'))); $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Table', $table->addColumn(new Column('bodytext', 'text'))); $columns = $table->getColumns(); $this->assertCount(3, $columns); foreach ($columns as $column) { $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Column', $column); } $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Column', $table->getColumn('title')); $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Table', $table->addIndex(new Index('title', 'title', 'unique'))); $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Table', $table->addIndex(new Index(['title', 'alias'], 'title_alias'))); $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Table', $table->addIndex(new Index(['bodytext'], 'bodytext', 'fulltext'))); $indexes = $table->getIndexes(); $this->assertCount(3, $indexes); foreach ($indexes as $index) { $this->assertInstanceOf('\\Phoenix\\Database\\Element\\Index', $index); } $this->setExpectedException('\\Exception', 'Column "unknown_column" not found'); $table->getColumn('unknown_column'); }