Change database connection in Migration class in Symfony

Viewed 1044

In migration class depending on logic, I need to use different types of database connections. How in migration class to get new connection by connection name?

Currently in doctrine.yaml file I have connection names "default", "user", "admin" and "cron".

My migration class:

final class Version20190711123152 extends AbstractMigration
{
     public function up(Schema $schema) : void
     { 
        ...

        if($someCondition) {
            $this->setConnection($wantedConnection) // how to set $wantedConnection for example on "admin" connection
        }
     }

    /**
     * @param Connection $connection
     */
    public function setConnection(Connection $connection): void
    {
        $this->connection = $connection;
    }

I am using Symfony 4.3

1 Answers

I don't know your exact use case, but I don't think the migrations should be conditional, i.e. you may end up with inconsistent databases across different environments.

Maybe consider storing migration files in separate directories and use different configuration and entity manager when running migrations.

# /config/migrations/default.yaml
name: "Default Migrations"
migrations_namespace: "App\Migrations\Default"
table_name: "doctrine_migration_versions"
migrations_directory: "src/Migrations/Default"
# /config/migrations/admin.yaml
name: "Admin Migrations"
migrations_namespace: "App\Migrations\Admin"
table_name: "doctrine_migration_versions"
migrations_directory: "src/Migrations/Admin"

Assuming you have configured two entity managers - one default and one i.e. with "admin" name you can run those migrations separately:

php bin/console doctrine:migrations:migrate --configuration=config/migrations/default.yaml
php bin/console doctrine:migrations:migrate --configuration=config/migrations/admin.yaml --em=admin
Related