教义迁移运行不相关的SQL

时间:2018-07-17 09:23:13

标签: symfony doctrine-orm

迁移理论最奇怪。

我应该迁移:

  • 将FK放在列上
  • 删除此列
  • 放一些桌子

因为我不知道FK的名称,所以我创建了通过检查Doctrine模式对象来返回和删除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()
            ));
        }
    }
}

0 个答案:

没有答案