[英]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 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.