Intereting Posts
Laravel 4: публикация активов пакета Проверка номеров телефонов Великобритании в PHP Невозможно следить за местоположением (URL) с помощью cURL, когда установлен параметр open_basedir – ошибка обратного вызова API Почему mysqli_connect () «неопределенная функция» на моем сервере PHP? Получить http-statuscode без тела с помощью cURL? MySQL Найдите различия в уровнях запасов между двумя таблицами и верните результат Тип содержимого ответа на скачивание файла Laravel – text / html в localhost Codeigniter: передача данных с контроллера для просмотра Каков наилучший способ определить, какая форма была отправлена? Элемент массива доступа, индексированный с помощью числовой строки как отлаживать javascript на хром Как PHPUnit проверить метод без возвращаемого значения? Функция PHP use () для области видимости? Невозможно получить отношение от одного до многих в Laravel 4 Как пройти пешком или проехать с помощью Google карт с помощью php

symfony2 + doctrine2 @ postgresql, устанавливающий схему

Я хочу использовать 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

Я создал более короткую версию того же кода.

https://gist.github.com/jkuchar/13c640fb2ac071da14f4

Начиная с Doctrine 2.5 вы можете указать имя схемы в аннотации @Table :

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

Единственным недостатком является то, что консоль Symfony не может этого сделать, вы должны указать ее вручную.