9

新しいプロジェクトで symfony2+doctrine2 を使いたいです。postgresql-schemes でちょっとした問題が発生しました。mysql とは対照的に、postgres では (他のデータベースと同様に) さまざまなスキームを指定できます。たとえば、productiv データベースには約 200 のスキームがあります。

現在の教義接続のスキーマを設定する必要があります。どうやってやるの?

doctrine2 のみを使用する別のプロジェクトで、数か月前にこの問題を解決しました。私は次のことをしました:

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

しかし、symfony2 のどこでそれを行うべきかわかりませんか?

4

2 に答える 2

4

独自の driver_class を実装して使用し、search_path を 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;
    }
}

\Doctrine\DBAL\Driver\PDOPgSql\Driver で保護されていると定義されていないため、_constructPdoDsn メソッドが必要です。PDO DriverOptions を使用しているため、少し「ハッキー」ですが、それが良い方法かどうかはわかりませんが、うまくいくようです。

お役に立てれば。

よろしくお願いします、

パトリック

于 2012-05-31T08:09:31.567 に答える
1

@TableDoctrine 2.5以降、注釈でスキーマ名を指定できます:

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

唯一の欠点は、symfony コンソールではそれができず、手動で指定する必要があることです。

于 2015-02-06T09:51:05.713 に答える