簡體   English   中英

使用doctrine的symfony2動態數據庫連接

[英]symfony2 dynamic database connection using doctrine

我試圖在Symfony 2中使用doctrine進行多個數據庫連接但不能這樣做。

我已經在谷歌和堆棧溢出中進行了廣泛搜索,但無論在哪里,它都是通過config.yml文件或動態數據庫完成的,其中所有數據庫都具有相同的模式/實體。

但對於我的情況,數據庫是基於子域確定的,並且所有子域的數據庫架構都不相同。

例如:
test1.example.com =>應加載test1 db
test2.example.com =>將加載test2 db

test1和test2 DB都是不同的,它們是在DB級別創建的,並且在doctrine中沒有實體條目。

任何人都可以幫助我在Symfony 2中如何做到這一點。

在我看來,使用Doctrines ODM並不是解決這個問題的正確方法。 您仍然可以使用Doctrine連接到數據庫並查詢它們。 但是如果你沒有實體類,那么使用實體管理器似乎是不合適的。

使用Doctrine進行連接處理

以下是使用doctrine Connection類創建與數據庫的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 ),我能夠弄清楚如何使用沒有教義實體的其他數據庫。 只需在動作控制器中使用以下代碼即可

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

因此,一個更改會更改數據庫名稱和其他參數。 希望它能幫助別人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM