您的代码示例仅显示一个连接。您必须定义数据库连接,例如 the documentation 中的示例:
简单的破解:不要使用实体管理器,而只是连接。
如果您想要一个简单的方法,请不要使用 EntityManager。如果您只想获取有关数据库的一些信息并且不想存储信息或使用实体,这可能是矫枉过正。然后,只需创建一个自定义连接并使用“vanilla”SQL:
$this->get('doctrine.dbal.connection_factory')->createConnection($params);
您的问题并未说明您期望有多少数据库。所以让我们描述两种可能性:少量(固定)数据库或动态连接。
多连接,简单方法
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
model_a:
driver: pdo_mysql
host: '%database_hosta%'
port: '%database_porta%'
dbname: '%database_namea%'
user: '%database_usera%'
password: '%database_passworda%'
charset: UTF8
model_b:
driver: pdo_mysql
host: '%database_hostb%'
port: '%database_portb%'
dbname: '%database_nameb%'
user: '%database_userb%'
password: '%database_passwordb%'
charset: UTF8
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
model_a:
connection: model_a
model_b:
connection: model_b
默认情况下,将使用连接default。在您的控制器中,您可以切换到另一个连接:
$customerEm = $this->getDoctrine()->getManager('model_a');
当然,您可以动态选择您的经理:
//just an example, I don't know how you choose which database to use.
$managerName = $company->getModelName();
$em = $this->getDoctrine()->getManager($managerName);
动态创建EntityManager
DoctrineBundle 不支持动态值(除了第一个示例中的配置值)。你可以create your own EntityManager,如果你不想(或不能)定义多个连接,因为动态表名。
创建工厂并将其定义为服务:
class EntityManagerFactory
{
public function createManager($dbname)
{
$isDevMode = false;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
// or if you prefer yaml or XML
//$config = Setup::createXMLMetadataConfiguration(array(__DIR__."/config/xml"), $isDevMode);
//$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yaml"), $isDevMode);
$conn = [
'driver' => 'pdo_mysql',
'username' => 'foo',
'password' => 'foo',
'dbname' => $dbname
];
// obtaining the entity manager
return EntityManager::create($conn, $config);
}
}
并在您的控制器中使用它:
public function controllerAction()
{
$em = $this->get(EntityManagerFactory::class)->getManager('model-name');
}