2012-05-18 3 views
8

새 프로젝트에 symfony2 + doctrine2를 사용하고 싶습니다. postgresql-schemes에 약간의 문제가 발생했습니다. mysql과 달리 (다른 데이터베이스와 같은) 포스트그레스에서는 다른 스키마를 지정할 수있다. 우리의 productiv 데이터베이스는 예를 들어 약 200 개의 스키마를 가지고 있습니다.symfony2 + doctrine2 @ postgresql 스키마 설정

현재의 교리 연결에 대한 스키마를 설정해야합니다. 어떻게해야합니까?

몇 달 전에 doctrine2 만 사용하는 다른 프로젝트에서이 문제를 해결했습니다. 다음과 같이했습니다 :

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

하지만 심포니 2에서 어디에서해야합니까?

+0

Symfony2는 doctrine을 사용하기 때문에 똑같은 방식으로 해결할 수 있습니다. – hakre

+0

예. 하지만 내가 어디에 연결해야하는지 모르겠다. (imfony2를 처음 접했을 때 ... –

+0

EntityManager를 찾으십시오. 아무런 변화가 없다면, grep은 친구입니다. – hakre

답변

4

자신의 driver_class를 구현하여 사용하고 PDO DriverOptions에서 search_path를 전달할 수 있습니다 (예 : 당신의 심포니 설정에 :

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

이 드라이버는 다음과 같이 보일 수 있습니다 : \ 교리 \ DBAL \ 드라이버 \ PDOPgSql \ 보호로 정의되어 있지 않기 때문에 당신은 _constructPdoDsn 방법이 필요

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

을 운전사. 우리가 PDO DriverOptions를 사용하고 있으며 그것이 좋은 방법인지 확실하지 않기 때문에 약간 "해킹"입니다.하지만 작동하는 것 같습니다.

희망이 도움이됩니다.

안부,

Patryk

+0

'\ Doctrine \ DBAL \ Driver \ PDOPgSql \ Driver.php'에서 확장하지 않으시겠습니까? –

0

:

이 유일한 단점은
/** 
* Clerk 
* 
* @Table(schema="schema") 
*/ 
class Clerk { } 

가, 심포니 콘솔은 할 수 없어, 당신은하여 지정해야 손.