我想在新项目中使用 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 中哪里做这个?
您可以尝试实现并使用您自己的 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 2.5 开始,您可以在
@Table
注释中指定模式名称:
/**
* Clerk
*
* @Table(schema="schema")
*/
class Clerk { }
唯一的缺点是,symfony 控制台无法做到这一点,你必须手动指定。
在堆栈 PostgreSQL、Symfony 6.4.3 和 Doctrine 2.17 中,您可以使用属性在实体类中设置模式名称。
示例
#[ORM\Table(schema: 'SCHEMA_NAME')]
但是当您进行迁移时,在公共模式中创建的迁移版本表,为了修复它,您需要将此参数添加到doctrine_migrations.yaml
storage:
# Default (SQL table) metadata storage configuration
table_storage:
table_name: '%env(resolve:SCHENA_NAME)%.doctrine_migration_versions'
您还需要 .env 文件变量 SCHEMA_NAME 并为此变量设置值。
抱歉我的英语,这不是我的母语。希望对大家有帮助。