Symfony 原则迁移运行不相关的SQL

Symfony 原则迁移运行不相关的SQL,symfony,doctrine-orm,Symfony,Doctrine Orm,理论移民做了最奇怪的事 我有一个迁移,它应该: 在列上放置FK 删除此列 放下一些桌子 因为我不知道FK名称,所以我创建了通过检查模式对象返回和删除FK的方法。相反,它似乎做到了: 执行我的迁移 然后在迁移完成后重新创建刚刚删除的列、fk-s和表,并输出这些SQL 我还注意到这是这个项目中的第一次迁移。如果我注释掉dropForeignKeys(并因此进行模式检查),那么就不会做额外的工作 为什么教条会这样做?我怎样才能防止它发生?原则是v2.6.1。Symfony是v3.4 迁移文件:

理论移民做了最奇怪的事

我有一个迁移,它应该:

  • 在列上放置FK
  • 删除此列
  • 放下一些桌子
因为我不知道FK名称,所以我创建了通过检查模式对象返回和删除FK的方法。相反,它似乎做到了:

  • 执行我的迁移
  • 然后在迁移完成后重新创建刚刚删除的列、fk-s和表,并输出这些SQL
我还注意到这是这个项目中的第一次迁移。如果我注释掉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()
            ));
        }
    }
}

您是否手动创建了条令迁移或使用
条令:迁移:diff
生成了条令迁移?如果您手动创建它,原则通常会使您的SQL与您的模型匹配,可能是您没有更改模型,因此它覆盖了您的更改。我认为这不重要-迁移只是一个简单的类,它在
up()
中执行命令。除此之外,没有其他命令。或者?除了这三个命令之外还有更多的命令(更多信息请参见api参考)。自动和手动的区别在于,条令对命令的解释可能与预期的不同,更改模型并自动生成迁移,然后在此基础上进行修改可能更容易(也更好)。