【问题标题】:symfony2 dynamic database connection using doctrinesymfony2 动态数据库连接使用学说
【发布时间】:2013-12-07 13:59:00
【问题描述】:

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

我在 Google 和 stack-overflow 中进行了广泛的搜索,但在任何地方都是通过 config.yml 文件或动态数据库完成的,其中所有数据库都具有相同的 schema/entities 。

但就我而言,数据库是根据子域确定的,并且所有子域的数据库架构都不相同。

例如:
test1.example.com => 应该加载 test1 db
test2.example.com => 将加载 test2 db

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

谁能帮我在 Symfony 2 中做到这一点。

【问题讨论】:

  • 您是否尝试在不创建 Doctrine 实体的情况下执行此操作?如果有,如何管理实体对象?
  • 是的,我没有创建原则条目,因为我不会事先知道架构/表结构。表和数据库名称是已知的,但不是表的字段,因为它可以被更改/删除/更改子域的管理员。示例:test3.example.com 的管理员将添加字段/自定义表格,这些都是直接使用 SQL 完成的。之后,test3.example.com 的其他用户将使用这些表。我知道我可以直接使用 SQL 进行查询,但它会导致编码混乱,因为我必须处理所有事情:(希望 Doctrine + Symfony 2 中有一些方法
  • 即使我为每个新数据库创建 Doctrine 实体,它也会导致更多问题,因为原则条目依赖于对 SAAS 环境不利的物理文件 :((尤其是在基于负载自动放大/缩小期间AWS )

标签: php mysql symfony doctrine-orm doctrine


【解决方案1】:

在我看来,使用 Doctrines ODM 并不是解决此问题的正确方法。你仍然可以使用 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();

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

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();
}

【讨论】:

  • 感谢您的帮助。我试图做同样的事情但失败了。 :( 我 $this->getContainer() 在控制器中不可用。我用谷歌搜索发现它必须在服务中完成。我做了同样的事情。创建了一个服务并添加了代码,但它仍然无法正常工作。我引用这个forum.symfony-project.org/viewtopic.php?t=41082&p=132396 来创建一个服务。你能帮帮我吗?我们应该在哪里编写 getContainer() 代码以及如何在我们的 Controller 中使用它们。
  • 我添加了一个关于如何在控制器中访问Request 对象的示例
  • 很高兴我能提供帮助。
【解决方案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();

据此更改数据库名称和其他参数。 希望对其他人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多