debianek
debianek

Reputation: 589

Creating database schema on the fly

I would like to create database for user when he register. The code for database creation looks like this

$connectionFactory = $this->container->get('doctrine.dbal.connection_factory');
$connection = $connectionFactory->createConnection(array(
    'driver' => 'pdo_mysql',
    'user' => 'root',
    'password' => 'mysecretpassword',
    'host' => 'localhost',
    'dbname' => 'userdatabase',
));

$params = $connection->getParams();
$name = isset($params['path']) ? $params['path'] : $params['dbname'];

unset($params['dbname']);

$tmpConnection = DriverManager::getConnection($params);

// Only quote if we don't have a path
if (!isset($params['path'])) {
    $name = $tmpConnection->getDatabasePlatform()->quoteSingleIdentifier($name);
}

$error = false;
try {
    $tmpConnection->getSchemaManager()->createDatabase($name);
    echo sprintf('<info>Created database for connection named <comment>%s</comment></info>', $name);
} catch (\Exception $e) {
    echo sprintf('<error>Could not create database for connection named <comment>%s</comment></error>', $name);
    echo sprintf('<error>%s</error>', $e->getMessage());
    $error = true;
}

$tmpConnection->close();

I have entities created for that database in AccountBundle but do not know how to create database schema when user database is created.

Upvotes: 1

Views: 403

Answers (1)

Alexey B.
Alexey B.

Reputation: 12033

It is often used in the tests. An example can be seen in LiipFunctionalTestBundle.

$metadatas = $om->getMetadataFactory()->getAllMetadata();
$schemaTool = new SchemaTool($om);
$schemaTool->dropDatabase($name);
if (!empty($metadatas)) {
    $schemaTool->createSchema($metadatas);
}

Upvotes: 1

Related Questions