2012-05-18 16 views
8

Ich möchte symfony2 + doctrine2 für ein neues Projekt verwenden. Ich stieß auf ein kleines Problem mit Postgresql-Schemas. Im Gegensatz zu mysql können Sie in Postgres (wie auch andere Datenbanken) verschiedene Schemata angeben. Unsere produktive Datenbank enthält beispielsweise rund 200 Schemata.symfony2 + doctrine2 @ postgresql Einstellung eines Schemas

Ich muss ein Schema für meine aktuelle Verbindung Lehre setzen. Wie kann ich das machen?

Ich löste dieses Problem vor ein paar Monaten in einem anderen Projekt, das nur doctrine2 verwendet. Ich tat folgendes:

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

Aber ich weiß nicht, wo ich das in symfony2 tun sollte?

+0

Symfony2 verwendet nur die Doktrin, Sie sollten es auf die gleiche Weise lösen können. – hakre

+0

ja. aber ich weiß nicht, wo ich haken sollte :(ich bin absolut neu zu symfony2 ... –

+0

Suchen Sie auch nach dem EntityManager. Wenn nichts geht, ist grep Ihr ​​Freund. – hakre

Antwort

4

können Sie versuchen, Ihre eigene driver_class zu implementieren und zu verwenden und den search_path in den PDO DriverOptions, z. in Ihrer symfony config:

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

Sie benötigen die _constructPdoDsn Methode, weil sie nicht als geschützt in \ Lehre \ DBAL \ Driver \ PDOPgSql definiert ist \:

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

Der Fahrer so etwas wie dies aussehen könnte Treiber. Es ist etwas "hacky", weil wir PDO DriverOptions verwenden und ich bin mir nicht sicher, ob das ein guter Weg ist - aber es scheint zu funktionieren.

Hoffe, das hilft.

Mit freundlichen Grüßen,

Patryk

+0

Warum nicht von '\ Doctrine \ DBAL \ Driver \ PDOPgSql \ Driver.php'? –

0

Seit Lehre 2.5 Sie die Schemanamen in der @Table Anmerkung angeben:

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

Der einzige Nachteil ist, kann die symfony-Konsole das nicht tun, müssen Sie es an, indem Hand.

Verwandte Themen