使用doctrine的symfony2动态数据库连接

时间:2013-12-07 13:59:00

标签: php mysql symfony doctrine-orm doctrine

我试图在Symfony 2中使用doctrine进行多个数据库连接但不能这样做。

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

但是对于我的情况,数据库是基于子域确定的,并且所有子域的数据库架构都不相同。

实施例
test1.example.com =>应加载test1 db
test2.example.com =>将加载test2 db

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

任何人都可以帮助我在Symfony 2中如何做到这一点。

2 个答案:

答案 0 :(得分:12)

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

使用Doctrine进行连接处理

以下是使用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();
}

答案 1 :(得分:2)

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

即可
$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();

因此,一个更改会更改数据库名称和其他参数。 希望它能帮助别人