2012-05-18 98 views
8

我想爲新項目使用symfony2 + doctrine2。我遇到了postgresql-schemes的一個小問題。與mysql相比,你可以在postgres(像其他數據庫)中指定不同的方案。例如,我們的生產數據庫有大約200個方案。symfony2 + doctrine2 @ postgresql設置模式

我必須爲我當前的學說連接設置一個模式。我怎樣才能做到這一點?

幾個月前我在另一個項目中解決了這個問題,這個項目只使用了doctrine2。我做了以下:

$em = Doctrine\ORM\EntityManager::create($connectionOptions, $config); 
$em->getConnection()->exec('SET SEARCH_PATH TO foobar'); 

但我不知道我應該在symfony2中做什麼?

+0

Symfony2只是使用原則,你應該能夠以完全相同的方式解決它。 – hakre

+0

是的。但我不知道我應該到哪裏進入:(im絕對新到symfony2 ... –

+0

尋找EntityManager以及如果什麼都沒有,grep是你的朋友 – hakre

回答

4

您可以嘗試實施並使用您自己的driver_class並將PDO DriverOptions中的search_path傳遞給在的symfony配置:

# Doctrine Configuration 
doctrine: 
    dbal: 
     driver: pdo_pgsql 
     driver_class: YourNamespace\YourBundle\Doctrine\DBAL\Driver\PDOPgSql\Driver 
     options: 
      search_path: YOUR_SEARCH_PATH 

司機可能是這個樣子:

namespace YourNamespace\YourBundle\Doctrine\DBAL\Driver\PDOPgSql; 

use Doctrine\DBAL\Platforms; 

class Driver extends \Doctrine\DBAL\Driver\PDOPgSql\Driver implements \Doctrine\DBAL\Driver 
{ 
    public function connect(array $params, $username = null, $password = null, array $driverOptions = array()) 
    { 
     // ADD SOME ERROR HANDLING WHEN THE SEARCH_PATH IS MISSING... 
     $searchPath = $driverOptions['search_path']; 
     unset($driverOptions['search_path']); 

     $connection = new \Doctrine\DBAL\Driver\PDOConnection(
      $this->_constructPdoDsn($params), 
      $username, 
      $password, 
      $driverOptions 
     ); 

     $connection->exec("SET SEARCH_PATH TO {$searchPath};"); 

     return $connection; 
    } 

    /** 
    * Constructs the Postgres PDO DSN. 
    * 
    * @return string The DSN. 
    */ 
    protected function _constructPdoDsn(array $params) 
    { 
     $dsn = 'pgsql:'; 
     if (isset($params['host']) && $params['host'] != '') { 
      $dsn .= 'host=' . $params['host'] . ' '; 
     } 
     if (isset($params['port']) && $params['port'] != '') { 
      $dsn .= 'port=' . $params['port'] . ' '; 
     } 
     if (isset($params['dbname'])) { 
      $dsn .= 'dbname=' . $params['dbname'] . ' '; 
     } 

     return $dsn; 
    } 
} 

需要,因爲作爲\原則\ DBAL \驅動程序\ PDOPgSql \保護它沒有定義_constructPdoDsn方法驅動程序。這有點「哈克」,因爲我們正在使用PDO DriverOptions,而且我不確定這是否是一種好方法 - 但它似乎起作用。

希望這會有所幫助。

最好的問候,

Patryk

+0

爲什麼不從'\ Doctrine \ DBAL \ Driver \ PDOPgSql \ Driver.php'擴展? –

0

由於學說2.5,你可以在@Table註釋指定架構名稱:

/** 
* Clerk 
* 
* @Table(schema="schema") 
*/ 
class Clerk { } 

唯一的缺點是,symfony的控制檯無法做到這一點,你必須指定它手。