/** * @throws \RuntimeException */ protected function validate() { if ($this->adapter->hasTable($this->origin->getName()) && $this->adapter->hasTable($this->destination->getName())) { return; } throw new \RuntimeException("Table `{$this->origin->getName()}` and `{$this->destination->getName()}` must exist."); }
/** * Extract the primary key of a table. * * @param \Phinx\Db\Table $table * @return string */ public function extractPrimaryKey(\Phinx\Db\Table $table) { $tableName = $table->getName(); $databaseName = $this->adapter->getOption('name'); $query = implode(" ", ['SELECT `COLUMN_NAME`', 'FROM `information_schema`.`COLUMNS`', "WHERE (`TABLE_SCHEMA` = '{$databaseName}')", "AND (`TABLE_NAME` = '{$tableName}')", "AND (`COLUMN_KEY` = 'PRI');"]); $result = $this->adapter->query($query); if ($result instanceof \PDOStatement) { return $result->fetchColumn(0); } if (is_array($result)) { return $result[0]; } return $result; }
/** * {@inheritdoc} */ public function addForeignKey(Table $table, ForeignKey $foreignKey) { $this->startCommandTimer(); $this->writeCommand('addForeignKey', array($table->getName(), $foreignKey->getColumns())); $this->execute(sprintf('ALTER TABLE %s ADD %s', $this->quoteTableName($table->getName()), $this->getForeignKeySqlDefinition($foreignKey, $table->getName()))); $this->endCommandTimer(); }
/** * {@inheritdoc} */ public function addForeignKey(Table $table, ForeignKey $foreignKey) { $adapterTable = clone $table; $adapterTableName = $this->getAdapterTableName($table->getName()); $adapterTable->setName($adapterTableName); return parent::addForeignKey($adapterTable, $foreignKey); }
/** * {@inheritdoc} */ public function insert(Table $table, $columns, $data) { $this->startCommandTimer(); $sql = sprintf("INSERT INTO %s ", $this->quoteTableName($table->getName())); $sql .= "(" . implode(', ', array_map(array($this, 'quoteColumnName'), $columns)) . ")"; $sql .= " VALUES (" . implode(', ', array_fill(0, count($columns), '?')) . ")"; $stmt = $this->getConnection()->prepare($sql); foreach ($data as $row) { $stmt->execute($row); } $this->endCommandTimer(); }
/** * Gets the SQLite Index Definition for an Index object. * * @param Index $index Index * @return string */ protected function getIndexSqlDefinition(Table $table, Index $index) { if ($index->getType() == Index::UNIQUE) { $def = 'UNIQUE INDEX'; } else { $def = 'INDEX'; } if (is_string($index->getName())) { $indexName = $index->getName(); } else { $indexName = $table->getName() . '_'; foreach ($index->getColumns() as $column) { $indexName .= $column . '_'; } $indexName .= 'index'; } $def .= ' `' . $indexName . '`'; return $def; }
/** * {@inheritdoc} */ public function insert(Table $table, $row) { $adapterTable = clone $table; $adapterTableName = $this->getAdapterTableName($table->getName()); $adapterTable->setName($adapterTableName); return parent::insert($adapterTable, $row); }
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(); }
/** * {@inheritdoc} */ public function createTable(Table $table) { $this->recordCommand('createTable', array($table->getName())); }
/** * {@inheritdoc} */ public function addForeignKey(Table $table, ForeignKey $foreignKey) { // TODO: DRY this up.... $this->startCommandTimer(); $this->writeCommand('addForeignKey', array($table->getName(), $foreignKey->getColumns())); $this->execute('pragma foreign_keys = ON'); $tmpTableName = 'tmp_' . $table->getName(); $rows = $this->fetchAll('select * from sqlite_master where `type` = \'table\''); $sql = ''; foreach ($rows as $row) { if ($row['tbl_name'] == $table->getName()) { $sql = $row['sql']; } } $this->fetchAll(sprintf('pragma table_info(%s)', $this->quoteTableName($table->getName()))); $columns = array(); foreach ($columns as $column) { $columns[] = $this->quoteColumnName($column['name']); } $this->execute(sprintf('ALTER TABLE %s RENAME TO %s', $this->quoteTableName($table->getName()), $tmpTableName)); $sql = substr($sql, 0, -1) . ',' . $this->getForeignKeySqlDefinition($foreignKey) . ')'; $this->execute($sql); $sql = sprintf('INSERT INTO %s(%s) SELECT %s FROM %s', $table->getName(), implode(', ', $columns), implode(', ', $columns), $tmpTableName); $this->execute($sql); $this->execute(sprintf('DROP TABLE %s', $this->quoteTableName($tmpTableName))); $this->endCommandTimer(); }
public function testItRenamesDestinationToOrigin() { $this->assertTrue($this->adapter->hasTable($this->destination->getName())); $this->switcher->run(); $this->assertFalse($this->adapter->hasTable($this->destination->getName())); }
/** * Gets the table name. * * @return string */ public function getName() { return $this->table->getName(); }