我正在尝试创建一个新的数据库并从Controller加载架构。
我在运行中创建了数据库,但不知道如何选择新数据库来加载模式。
这是我的代码:
参数.yml
parameters:
# Admin database
database_driver: pdo_mysql
database_host: localhost
database_port: '3306'
database_name: app_db
database_user: root
database_password: XXX
# A Center database
database_driver2: pdo_mysql
database_host2: localhost
database_port2: '3306'
database_name2: center_1
database_user2: root
database_password2: XXX
config.yml
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
center:
driver: %database_driver2%
host: %database_host2%
port: %database_port2%
dbname: %database_name2%
user: %database_user2%
password: %database_password2%
charset: UTF8
orm:
auto_generate_proxy_classes: %kernel.debug%
#auto_mapping: true
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
BackendBundle: ~
CenterBundle: ~
center:
connection: center
mappings:
UsuarioBundle: ~
在控制器中,当我添加一个新的中心时,我会动态创建数据库,center_1,center_2…
###################
# CREATE DATABASE #
###################
$connectionFactory = $this->container->get('doctrine.dbal.connection_factory');
$connection = $connectionFactory->createConnection(array(
'driver' => 'pdo_mysql',
'user' => 'root',
'password' => XXX,
'host' => 'localhost',
'dbname' => 'center_'.$center->getId(),
));
$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();
我的问题是,如何选择那个数据库并加载模式。
可以随时更改Center数据库的参数.yml,然后执行命令:
app/console doctrine:schema:create --em=center
如果不可能,另一个想法怎么做?
************2013年1月14日版
我加了一个我喜欢的例子,也许我没有解释好。
当我添加一个新中心时,上面的代码会创建一个新的中心,并为该中心创建一个数据库,例如数据库调用"center_13">
现在,如果我喜欢创建数据库模式,我需要转到parameters.yml并为这个数据库创建一个新的参数
参数.yml
parameters:
....
# A Center database
database_name_13: center_13
我还需要在config.yml 中创建一个新的连接
config.yml
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
...
center_13:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name_13%
user: %database_user%
password: %database_password%
charset: UTF8
orm:
auto_generate_proxy_classes: %kernel.debug%
#auto_mapping: true
default_entity_manager: default
entity_managers:
default:
...
center_13:
connection: center_13
mappings:
UsuarioBundle: ~
现在,如果我运行命令
app/console doctrine:schema:create --em=center_13
它使用UsuarioBundle实体配置数据库"center_13"。
我想知道如何在我的控制器的去创建中心操作中完成这个过程
命令
应用程序/控制台原则:模式:创建
或
应用程序/控制台原则:模式:更新
将按照模型配置中的定义配置数据库,但不是从控制器配置。
您可以创建一个自定义的symfony命令,并将其与createDatabaseController相关联,但我会首先确保这是值得的。