예제 #1
0
 /**
  * {@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();
 }
예제 #2
0
 /**
  * {@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);
     }
 }
예제 #3
0
 /**
  * {@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();
 }
예제 #4
0
 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();
 }