迁移理论最奇怪。
我应该迁移:
因为我不知道FK的名称,所以我创建了通过检查Doctrine模式对象来返回和删除FK的方法。相反,它似乎可以做到:
我还注意到,这是该项目的首次迁移。如果我注释掉dropForeignKeys(以及模式检查),则不会做任何额外的工作。
为什么教义会这样做,如何防止它发生呢?教义是v2.6.1。 Symfony是v3.4。
迁移文件:
final class Version20180606143534 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$con = $this->connection;
$this->dropForeignKeys($con, $schema, 'table1', 'table2_id');
$con->exec('alter table table1 drop column table2_id');
$con->exec('DROP TABLE table3');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
}
/**
* Returns foreign keys for a table and optionally column
* @param Schema $schema
* @param string $table
* @param string|null $columnName
* @return ForeignKeyConstraint[]
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
private function getForeignKeys(Schema $schema, $table, $columnName = null)
{
$fks = $schema->getTable($table)->getForeignKeys();
if ($columnName) {
foreach ($fks as $id => $fk) {
$columnNames = $fk->getLocalColumns();
if (!in_array($columnName, $columnNames)) {
unset($fks[$id]);
}
}
}
return $fks;
}
private function dropForeignKeys(Connection $con, Schema $schema, $table, $columnName = null)
{
$fks = $this->getForeignKeys($schema, $table, $columnName);
// var_dump(sprintf('..table %s has %s fks', $table, count($fks)));
foreach ($fks as $fk) {
$con->exec(sprintf(
'ALTER TABLE %s DROP FOREIGN KEY %s', $fk->getLocalTableName(), $fk->getName()
));
}
}
}