/** * {@inheritdoc} */ public function createTable(Table $table) { $this->startCommandTimer(); $options = $table->getOptions(); // Add the default primary key $columns = $table->getPendingColumns(); if (!isset($options['id']) || isset($options['id']) && $options['id'] === true) { $column = new Column(); $column->setName('id')->setType('integer')->setIdentity(true); array_unshift($columns, $column); $options['primary_key'] = 'id'; } elseif (isset($options['id']) && is_string($options['id'])) { // Handle id => "field_name" to support AUTO_INCREMENT $column = new Column(); $column->setName($options['id'])->setType('integer')->setIdentity(true); array_unshift($columns, $column); $options['primary_key'] = $options['id']; } $sql = 'CREATE TABLE '; $sql .= $this->quoteTableName($table->getName()) . ' ('; $sqlBuffer = array(); $columnsWithComments = array(); foreach ($columns as $column) { $sqlBuffer[] = $this->quoteColumnName($column->getName()) . ' ' . $this->getColumnSqlDefinition($column); // set column comments, if needed if ($column->getComment()) { $columnsWithComments[] = $column; } } // set the primary key(s) if (isset($options['primary_key'])) { $pkSql = sprintf('CONSTRAINT PK_%s PRIMARY KEY (', $table->getName()); if (is_string($options['primary_key'])) { // handle primary_key => 'id' $pkSql .= $this->quoteColumnName($options['primary_key']); } elseif (is_array($options['primary_key'])) { // handle primary_key => array('tag_id', 'resource_id') // PHP 5.4 will allow access of $this, so we can call quoteColumnName() directly in the anonymous function, // but for now just hard-code the adapter quotes $pkSql .= implode(',', array_map(function ($v) { return '[' . $v . ']'; }, $options['primary_key'])); } $pkSql .= ')'; $sqlBuffer[] = $pkSql; } // set the foreign keys $foreignKeys = $table->getForeignKeys(); if (!empty($foreignKeys)) { foreach ($foreignKeys as $foreignKey) { $sqlBuffer[] = $this->getForeignKeySqlDefinition($foreignKey, $table->getName()); } } $sql .= implode(', ', $sqlBuffer); $sql .= ');'; // process column comments if (!empty($columnsWithComments)) { foreach ($columnsWithComments as $column) { $sql .= $this->getColumnCommentSqlDefinition($column, $table->getName()); } } // set the indexes $indexes = $table->getIndexes(); if (!empty($indexes)) { foreach ($indexes as $index) { $sql .= $this->getIndexSqlDefinition($index, $table->getName()); } } // execute the sql $this->writeCommand('createTable', array($table->getName())); $this->execute($sql); $this->endCommandTimer(); }
/** * {@inheritdoc} */ public function createTable(Table $table) { $this->startCommandTimer(); // Add the default primary key $columns = $table->getPendingColumns(); $options = $table->getOptions(); if (!isset($options['id']) || isset($options['id']) && $options['id'] === true) { $column = new Column(); $column->setName('id')->setType('integer')->setIdentity(true); array_unshift($columns, $column); } elseif (isset($options['id']) && is_string($options['id'])) { // Handle id => "field_name" to support AUTO_INCREMENT $column = new Column(); $column->setName($options['id'])->setType('integer')->setIdentity(true); array_unshift($columns, $column); } $sql = 'CREATE TABLE '; $sql .= $this->quoteTableName($table->getName()) . ' ('; foreach ($columns as $column) { $sql .= $this->quoteColumnName($column->getName()) . ' ' . $this->getColumnSqlDefinition($column) . ', '; } // set the primary key(s) if (isset($options['primary_key'])) { $sql = rtrim($sql); $sql .= ' PRIMARY KEY ('; if (is_string($options['primary_key'])) { // handle primary_key => 'id' $sql .= $this->quoteColumnName($options['primary_key']); } elseif (is_array($options['primary_key'])) { // handle primary_key => array('tag_id', 'resource_id') // PHP 5.4 will allow access of $this, so we can call quoteColumnName() directly in the anonymous function, // but for now just hard-code the adapter quotes $sql .= implode(',', array_map(function ($v) { return '`' . $v . '`'; }, $options['primary_key'])); } $sql .= ')'; } else { $sql = substr(rtrim($sql), 0, -1); // no primary keys } // set the foreign keys $foreignKeys = $table->getForeignKeys(); if (!empty($foreignKeys)) { foreach ($foreignKeys as $foreignKey) { $sql .= ', ' . $this->getForeignKeySqlDefinition($foreignKey); } } $sql = rtrim($sql) . ');'; // execute the sql $this->writeCommand('createTable', array($table->getName())); $this->execute($sql); $this->endCommandTimer(); foreach ($table->getIndexes() as $index) { $this->addIndex($table, $index); } }
/** * {@inheritdoc} */ public function createTable(Table $table) { $this->startCommandTimer(); // This method is based on the MySQL docs here: http://dev.mysql.com/doc/refman/5.1/en/create-index.html $defaultOptions = array('engine' => 'InnoDB', 'collation' => 'utf8_general_ci'); $options = array_merge($defaultOptions, $table->getOptions()); // Add the default primary key $columns = $table->getPendingColumns(); if (!isset($options['id']) || isset($options['id']) && $options['id'] === true) { $column = new Column(); $column->setName('id')->setType('integer')->setIdentity(true); array_unshift($columns, $column); $options['primary_key'] = 'id'; } elseif (isset($options['id']) && is_string($options['id'])) { // Handle id => "field_name" to support AUTO_INCREMENT $column = new Column(); $column->setName($options['id'])->setType('integer')->setIdentity(true); array_unshift($columns, $column); $options['primary_key'] = $options['id']; } // TODO - process table options like collation etc // process table engine (default to InnoDB) $optionsStr = 'ENGINE = InnoDB'; if (isset($options['engine'])) { $optionsStr = sprintf('ENGINE = %s', $options['engine']); } // process table collation if (isset($options['collation'])) { $charset = explode('_', $options['collation']); $optionsStr .= sprintf(' CHARACTER SET %s', $charset[0]); $optionsStr .= sprintf(' COLLATE %s', $options['collation']); } // set the table comment if (isset($options['comment'])) { $optionsStr .= sprintf(" COMMENT=%s ", $this->getConnection()->quote($options['comment'])); } $sql = 'CREATE TABLE '; $sql .= $this->quoteTableName($table->getName()) . ' ('; foreach ($columns as $column) { $sql .= $this->quoteColumnName($column->getName()) . ' ' . $this->getColumnSqlDefinition($column) . ', '; } // set the primary key(s) if (isset($options['primary_key'])) { $sql = rtrim($sql); $sql .= ' PRIMARY KEY ('; if (is_string($options['primary_key'])) { // handle primary_key => 'id' $sql .= $this->quoteColumnName($options['primary_key']); } elseif (is_array($options['primary_key'])) { // handle primary_key => array('tag_id', 'resource_id') // PHP 5.4 will allow access of $this, so we can call quoteColumnName() directly in the // anonymous function, but for now just hard-code the adapter quotes $sql .= implode(',', array_map(function ($v) { return '`' . $v . '`'; }, $options['primary_key'])); } $sql .= ')'; } else { $sql = substr(rtrim($sql), 0, -1); // no primary keys } // set the indexes $indexes = $table->getIndexes(); if (!empty($indexes)) { foreach ($indexes as $index) { $sql .= ', ' . $this->getIndexSqlDefinition($index); } } // set the foreign keys $foreignKeys = $table->getForeignKeys(); if (!empty($foreignKeys)) { foreach ($foreignKeys as $foreignKey) { $sql .= ', ' . $this->getForeignKeySqlDefinition($foreignKey); } } $sql .= ') ' . $optionsStr; $sql = rtrim($sql) . ';'; // execute the sql $this->writeCommand('createTable', array($table->getName())); $this->execute($sql); $this->endCommandTimer(); }
public function testAddTableWithForeignKey() { $this->mock->expects($this->any())->method('isValidColumnType')->with($this->callback(function ($column) { return in_array($column->getType(), array('string', 'integer')); }))->will($this->returnValue(true)); $table = new Table('table', array(), $this->adapter); $table->addColumn('bar', 'string')->addColumn('relation', 'integer')->addForeignKey('relation', 'target_table', array('id')); $this->mock->expects($this->once())->method('createTable')->with($this->callback(function ($table) { if ($table->getName() !== 'pre_table_suf') { throw new \Exception(sprintf('Table::getName was not prefixed/suffixed properly: "%s"', $table->getName())); } $fks = $table->getForeignKeys(); if (count($fks) !== 1) { throw new \Exception(sprintf('Table::getForeignKeys count was incorrect: %d', count($fks))); } foreach ($fks as $fk) { if ($fk->getReferencedTable()->getName() !== 'pre_target_table_suf') { throw new \Exception(sprintf('ForeignKey::getReferencedTable was not prefixed/suffixed properly: "%s"', $fk->getReferencedTable->getName())); } } return true; })); $table->create(); }