2012-05-18 4 views
8

Voglio usare symfony2 + doctrine2 per un nuovo progetto. Mi sono imbattuto in un piccolo problema con schemi postgresql. Al contrario di mysql è possibile specificare in schemi postgres (come altri database) diversi. Il nostro database produttivo ha circa 200 schemi, ad esempio.symfony2 + doctrine2 @ postgresql che imposta uno schema

Devo impostare uno schema per la mia attuale connessione di dottrina. Come lo posso fare?

Ho risolto questo problema alcuni mesi fa in un altro progetto, che utilizza solo doctrine2. Ho fatto quanto segue:

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

Ma non so dove dovrei farlo in symfony2?

+0

Symfony2 usa solo la dottrina, dovresti essere in grado di risolverlo nello stesso modo. – hakre

+0

sì. ma non so dove dovrei collegarmi :(Im assolutamente nuovo per symfony2 ... –

+0

Cerca anche EntityManager Se non ci sono problemi, grep è tuo amico – hakre

risposta

4

si potrebbe provare a implementare e utilizzare il proprio driver_class e passare il search_path in DriverOptions PDO, ad es. nella configurazione di symfony:

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

Il driver potrebbe essere simile a questa:

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

È necessario il metodo _constructPdoDsn perché non è definito come protetto in \ Doctrine \ DBAL \ Driver \ PDOPgSql \ driver. È un po '"hacky" perché stiamo usando PDO DriverOptions e non sono sicuro che sia un buon modo - ma sembra funzionare.

Spero che questo aiuti.

Con i migliori saluti,

Patryk

+0

Perché non estendere da '\ Doctrine \ DBAL \ Driver \ PDOPgSql \ Driver.php'? –

0

Dal Dottrina 2.5 è possibile specificare il nome dello schema nel @Table della nota:

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

L'unico inconveniente è la console di symfony non può farlo, è necessario specificarlo entro mano.