【问题标题】:symfony2 + doctrine2@postgresql setting a schemasymfony2 + dictionary2@postgresql 设置模式
【发布时间】:2012-05-26 03:32:08
【问题描述】:

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

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

几个月前我在另一个项目中解决了这个问题,该项目只使用了学说2。我做了以下事情:

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

但我不知道我应该在 symfony2 中的哪个位置执行此操作?

【问题讨论】:

  • Symfony2 只是使用了学说,你应该能够以完全相同的方式解决它。
  • 是的。但我不知道我应该在哪里挂钩:(我对 symfony2 完全陌生...
  • 同时寻找 EntityManager。如果没有任何反应,grep 就是你的朋友。
  • 是的,但我不想修改 symfony2 文件 :) 所以我想我必须在一个特殊的地方添加一些特殊的代码。也许我需要添加一个从教义捆绑包继承的捆绑包?
  • 我不知道,但我会悬赏你的问题,也许它有助于获得一些关注。

标签: php postgresql symfony doctrine-orm


【解决方案1】:

您可以尝试实现和使用自己的 driver_class 并在 PDO DriverOptions 中传递 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\PDOPgSql\Driver 中定义为受保护的。这有点“hacky”,因为我们正在使用 PDO DriverOptions,我不确定这是否是一个好方法 - 但它似乎有效。

希望这会有所帮助。

最好的问候,

帕特里克

【讨论】:

  • 为什么不从\Doctrine\DBAL\Driver\PDOPgSql\Driver.php扩展?
【解决方案2】:

从 Doctrine 2.5 开始,您可以在 @Table 注释中指定模式名称:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2011-08-02
    相关资源
    最近更新 更多