symfony2动态数据库连接使用条令


symfony2 dynamic database connection using doctrine

我试图在Symfony 2中使用条令建立多个数据库连接,但无法做到。

我在谷歌和堆栈溢出中进行了广泛的搜索,但在任何地方都是通过config.yml文件或动态数据库完成的,其中所有数据库都有相同的模式/实体。

但在我的情况下,数据库是根据子域确定的,并且数据库架构并不适用于所有子域

示例:
test1.example.com=>应加载test1数据库
test2.example.com=>将加载test2db

test1和test2数据库都不同,都是在数据库级别创建的,并且在条令中没有实体条目

有人能帮我在Symfony 2中怎么做吗。

在我看来,使用Doctrines ODM不是解决这一问题的正确方法。您仍然可以使用Doctrine连接到数据库并查询它们。但是,如果您没有实体类,那么使用实体管理器似乎是不合适的。

连接处理使用原则

以下是如何使用条令Connection类创建与数据库的连接:

/** @var 'Doctrine'Bundle'DoctrineBundle'ConnectionFactory $connectionFactory */
$connectionFactory = $this->getContainer()->get('doctrine.dbal.connection_factory');
$connection = $connectionFactory->createConnection(
    array('pdo' => new 'PDO("mysql:host=$hostname;dbname=$dbname", $username, $password))
);

现在您可以将$connection用作一个简单的PDO对象:

$connection->executeQuery('SELECT * FROM your_table');

您可以将此代码添加为服务,使其可以在任何地方访问
如果你想连接到不同域的不同数据库,你可以使用以下代码来识别域:

$this->getRequest()->getHost();

要在操作中访问域,请执行以下操作:

public function yourAction(Request $request, /* ... */)
{
    // the Controller extends the Container. So need to get it here:
    $connectionFactory = $this->get('doctrine.dbal.connection_factory');
    // also access the domain like this:
    $domain = $request->getHost();
}

感谢byf ferdy(https://stackoverflow.com/a/20444097/2976700),我能够弄清楚如何使用其他没有条令实体的DB。只需在您的动作控制器中使用以下代码

$connectionFactory = $this->get('doctrine.dbal.connection_factory');                
$connection = $connectionFactory->createConnection(
                array('pdo' => new 'PDO("mysql:host=$hostname;dbname=$dbname", 
                       $username,$password))
 );
 $query = $connection->executeQuery('SELECT * FROM multi_client');
 $results = $query->fetchAll();

要知道访问的子域,可以使用$domain=$request->getHost();

相应地,一个改变改变了DB名称和其他参数。希望它能帮助其他