4

在验证和更新模式时,我正在努力让 symfony/doctrine 排除数据库视图。

我第一次尝试没有教义迁移(参见这个问题),但没有奏效。

我发现学说迁移会从验证/更新中过滤掉视图,并且确实如此,因此该步骤似乎适用于迁移。

因此,如果一个人只有一个数据库,则学说迁移可以正常工作,但至少可以说,具有多个数据库的设置并不是干净利落的。

这是一个已知问题,您可以在此链接上看到。不幸的是,当尝试遵循链接中描述的解决方案时,结果很混乱。

即使命令 migrations:update --em=default 将指示设置了正确的数据库,但在生成 migrations:diff --em=default 时,它将与其他数据库混合,同样与 migrations:migrate --em=default 结束在另一个数据库上创建表。

更具体地说,错误是: - 它将为配置文件中指示的迁移文件创建单独的目录,但不会创建相应的 em - 它会生成混合两个 em 的 mysql 查询 - 因此它将更新 db

我的设置如下:

配置.yml

imports:
....
- { resource: doctrine_migrations_default.yml }
- { resource: doctrine_migrations_used.yml }

doctrine:
  dbal:
    default_connection: default
    connections:
        default:      
            .....
            #schema_filter: "~^(?!view).*$~"
            schema_filter: ~^(?!view_)~
        used:
             ......

orm:
    auto_generate_proxy_classes: '%kernel.debug%'
    default_entity_manager: default
    entity_managers:
        default:
            naming_strategy: doctrine.orm.naming_strategy.underscore
            connection: default
            auto_mapping: true
            mappings:
                AppBundle:  ~
        used:
            naming_strategy: doctrine.orm.naming_strategy.underscore
            connection: used
            mappings:
                UsedBundle: ~ 

然后,迁移的具体配置文件是:

学说迁移默认.yml

doctrine_migrations: 
        dir_name: "%kernel.root_dir%/DoctrineMigrationsDefault"
        namespace: App\DoctrineMigrationsDefault
        table_name: migration_versions
        name: Application_Migrations_Default 

学说迁移使用的.yml

doctrine_migrations:
    dir_name: "%kernel.root_dir%/DoctrineMigrationsUsed"
    namespace: Used\DoctrineMigrationsUsed
    table_name: migration_versions
    name: Application Migrations Used
    organize_migrations: false

这是它如何混合配置的一个示例。数据库名称正确。它对应于 em=default。但其他信息来自 em=used

谢谢

php bin/console doctrine:migrations:status --em=default

== 配置

>> Name:                                               Application Migrations Used
>> Database Driver:                                    pdo_mysql
>> Database Name:                                      symfony_cars
>> Configuration Source:                               manually configured
>> Version Table Name:                                 migration_versions
>> Version Column Name:                                version
>> Migrations Namespace:                               Used\DoctrineMigrationsUsed
>> Migrations Directory:                               /Users/BAMAC/Sites/Symfony1/app/DoctrineMigrationsUsed
>> Previous Version:                                   Already at first version
>> Current Version:                                    0
>> Next Version:                                       2017-10-19 08:03:52 (20171019080352)
>> Latest Version:                                     2017-10-19 08:03:52 (20171019080352)
>> Executed Migrations:                                0
>> Executed Unavailable Migrations:                    0
>> Available Migrations:                               1
>> New Migrations:                                     1

另外,如果我尝试使用以下内容专门指示配置文件:

php bin/console 学说:迁移:状态 --em=default --configuration=./app/config/doctrine_migrations_default.yml

它不会识别文件信息,即使它直接从 config.yml 获取信息时也会识别。抛出以下错误。

[Doctrine\DBAL\Migrations\MigrationException]
迁移配置键“doctrine_migrations”不存在。

如果我取出教义迁移键,它将在遇到的下一个信息中生成错误。

4

2 回答 2

5

不要在 config.yml 文件中导入迁移设置。

您的个人配置文件实际上并未正确配置,这就是您收到有关配置键不存在的错误的原因。键与正常迁移配置中的键不同。我不得不搜索代码以找到正确的设置。(我在AbstractFileConfiguration.php 文件的 ln35 附近找到了它们)

试试这些——

学说迁移默认.yml

migrations_directory: "app/DoctrineMigrationsDefault"
migrations_namespace: App\DoctrineMigrationsDefault
table_name: migration_versions
name: Application_Migrations_Default 

学说迁移使用的.yml

migrations_directory: "app/DoctrineMigrationsUsed"
migrations_namespace: Used\DoctrineMigrationsUsed
table_name: migration_versions
name: Application Migrations Used
organize_migrations: false #valid entries are false, 'year', and 'year_and_month'

学说迁移、目录名称和命名空间不是该配置文件的有效条目。

此外,您不能在目录路径中使用 %kernel.root_dir% ,但对我有用的是将其更改为“应用程序”或提供完整路径。

于 2018-03-30T16:41:14.957 回答
2

将此留作将来参考:

在执行跨多个实体管理器的迁移时,文件教义_migrations_default.yaml 和教义_migrations_used.yaml 用于额外的配置。

这些文件不应该被 symfony 自动加载,你可以直接把它们放在 config/ 下,而不是在教义迁移.yaml 所在的 config/packages 下。

我在 symfony 5.0.4 上对其进行了测试,它运行良好:

php bin/console doctrine:migrations:migrate --em=used --configuration=config/doctrine_migrations_used.yaml

于 2020-02-10T13:43:55.427 回答