Symfony2 + doctrine2@postgresql设置模式


symfony2 + doctrine2@postgresql setting a schema

我想将symfony2+doctrine2用于一个新项目。我在postgresql-schemes上遇到了一个小问题。与mysql相比,您可以在postgres(像其他数据库一样(中指定不同的方案。例如,我们的生产数据库有大约 200 个方案。

必须为我当前的教义连接设置一个模式。我该怎么做?

几个月前,我在另一个项目中解决了这个问题,该项目仅使用doctrine2。我做了以下工作:

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

但我不知道我应该在symfony2中在哪里这样做?

你可以尝试实现和使用你自己的driver_class,并在PDO驱动程序选项中传递search_path,例如在你的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;
    }
}

您需要 _constructPdoDsn 方法,因为它未在 ''Doctrine''DBAL''Driver''Driver''PDOPgSql''Driver 中定义为受保护。这有点"黑客",因为我们使用的是PDO驱动程序选项,我不确定这是否是一个好方法 - 但它似乎有效。

希望这有帮助。

此致敬意

帕特里克

从原则 2.5 开始,您可以在@Table注释中指定架构名称:

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

唯一的缺点是,symfony控制台不能做到这一点,你必须手动指定它。