Symfony2原则:模式:使用多个实体管理器进行更新



我在config.yml中有两个数据库连接和两个实体管理器。每个都被绑在一捆上。

我遇到的问题是运行单元测试,它首先创建一个空白数据库并加载数据。它创建了两个数据库,但我在每个数据库中都得到了两组表,而不是一个数据库中有一组实体,另一个数据库则有一组。由于两个数据库连接并不常见,我很难找到一些帮助。

doctrine:
    dbal:
        default_connection: default
 ...
    connections:
         default:
         (conectioninfo)
         seconddb:
         (connectioninfo)

 orm:
    default_entity_manager: default
    auto_generate_proxy_classes: "%kernel.debug%"
    entity_managers:
    default:
        connection: default
        mappings:
           MycompanyCoreBundle: ~
    seconddb:
        connection: seconddb
        mappings:
           MycomanySecondBundle: ~

当运行单元测试时,我有以下行:

php app/console doctrine:database:drop --force --env=test --connection=default 
php app/console doctrine:database:create --env=test --connection=default
php app/console doctrine:schema:drop --force --no-interaction --env=test --em=default
php app/console doctrine:schema:update --force --no-interaction --env=test --em=default
php app/console doctrine:database:drop --force --env=test --connection=seconddb
php app/console doctrine:database:create --env=test --connection=seconddb
php app/console doctrine:schema:drop --force --no-interaction --env=test --em=seconddb
php app/console doctrine:schema:update --force --no-interaction --env=test --em=seconddb

当运行所有这些时,输出为

Successfully deleted cache entries.
Dropping database schema...
Database schema dropped successfully!
Updating database schema...
Database schema updated successfully! "91" queries were executed

问题是,这91个查询是两个捆绑包中两个实体文件夹的组合。我缺少一个可以分别指出它们的地方,以便它们进入各自的数据库。

我最终找到了答案。没有办法为迁移指定数据库,所以基本上必须在EM上运行迁移两次,然后测试数据库连接。

在每个迁移文件中,如果它不是正确的,您可以放一行忽略它。因此,有些文件具有

$this->skipIf( $this->connection->getDatabase() != 'dbone', 'Skipping database.' );

其他人有

$this->skipIf( $this->connection->getDatabase() != 'dbtwo', 'Skipping database.' );

然后当你运行这些命令时:

doctrine:migrations:migrate --em="default"
doctrine:migrations:migrate --em="orm"

两者都将在所有迁移文件中循环,但不适用于这种情况的文件将被忽略。

最新更新