Php symfony2+;doctrine2@postgresql设置模式

Php symfony2+;doctrine2@postgresql设置模式,php,postgresql,symfony,doctrine-orm,Php,Postgresql,Symfony,Doctrine Orm,我想在一个新项目中使用symfony2+doctrine2。我遇到了一个关于postgresql方案的小问题。与mysql不同,您可以在postgres(与其他数据库一样)中指定不同的方案。例如,我们的productiv数据库有大约200个方案 我必须为我当前的条令连接设置一个模式。我该怎么做 几个月前,我在另一个只使用doctrine2的项目中解决了这个问题。我做了以下工作: $em = Doctrine\ORM\EntityManager::create($connectionOptions

我想在一个新项目中使用symfony2+doctrine2。我遇到了一个关于postgresql方案的小问题。与mysql不同,您可以在postgres(与其他数据库一样)中指定不同的方案。例如,我们的productiv数据库有大约200个方案

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

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

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

但是我不知道在symfony2中应该在哪里执行此操作?

您可以尝试实现并使用自己的驱动程序类,并在PDO驱动程序选项中传递搜索路径,例如在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方法,因为它在\doctor\DBAL\Driver\PDOPgSql\Driver中未定义为受保护。这有点“骇客”,因为我们正在使用PDO驱动程序,我不确定这是否是一个好方法,但它似乎是可行的

希望这有帮助

致以最良好的祝愿


Patryk

自第2.5条以来,您可以在
@表
注释中指定模式名称:

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

唯一的缺点是,symfony控制台无法做到这一点,您必须手动指定它。

Symfony2只是使用原则,您应该能够以完全相同的方式解决它。是的。但是我不知道我应该挂在哪里:(我对symfony2绝对是新手…还需要寻找EntityManager。如果没有任何进展,grep是你的朋友。是的,但我不想修改symfony2文件:)所以我想我必须在一个特殊的地方添加一些特殊的代码。也许我需要添加一个从条令捆绑包继承的捆绑包?我不知道,但我会对你的问题给予奖励,也许这有助于引起一些注意。为什么不从
\doctor\DBAL\Driver\PDOPgSql\Driver.php
扩展?