Я хочу использовать symfony2 + doctrine2 для нового проекта. У меня возникла небольшая проблема с postgresql-схемами. В отличие от mysql, вы можете указать в postgres (как и другие базы данных) разные схемы. Например, наша база данных productiv насчитывает около 200 схем.
Я должен установить схему для моего текущего соединения доктрины. Как я могу это сделать?
Я решил эту проблему несколько месяцев назад в другом проекте, который использует только doctrine2. Я сделал следующее:
$em = Doctrine\ORM\EntityManager::create($connectionOptions, $config); $em->getConnection()->exec('SET SEARCH_PATH TO foobar');
Но я не знаю, где я должен сделать это в symfony2?
вы можете попытаться реализовать и использовать свой собственный драйвер_процесса и передать путь search_ в PDO DriverOptions, например, в конфиге 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; } }
не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; } }
Вам нужен метод _constructPdoDsn, поскольку он не определен как защищенный в \ Doctrine \ DBAL \ Driver \ PDOPgSql \ Driver. Это немного «взломанно», потому что мы используем PDO DriverOptions, и я не уверен, что это хороший способ, но, похоже, он работает.
Надеюсь это поможет.
С наилучшими пожеланиями,
Patryk
Я создал более короткую версию того же кода.
Начиная с Doctrine 2.5 вы можете указать имя схемы в аннотации @Table
:
/** * Clerk * * @Table(schema="schema") */ class Clerk { }
Единственным недостатком является то, что консоль Symfony не может этого сделать, вы должны указать ее вручную.