Symfony 7多实体配置异常:跨数据库迁移表重复创建问题
解决方案
你的配置里存在两个关键问题,导致Doctrine迁移会把所有表重复创建到每个数据库中:
1. 修正Sys实体管理器的映射键错误
在doctrine.yaml的sys实体管理器配置中,mappings的键被错误地写成了Logs,这会导致Doctrine识别映射时出现混淆。需要将其改为Sys,与对应的实体目录、命名前缀保持一致:
# 修正后的sys实体管理器配置片段 sys: auto_mapping: false connection: sys report_fields_where_declared: true validate_xml_mapping: true naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware mappings: Sys: # 从Logs改为Sys is_bundle: false dir: '%kernel.project_dir%/src/Entity/Sys' prefix: 'App\Entity\Sys' alias: Sys
2. 为Doctrine Migrations配置实体管理器隔离
默认情况下,Doctrine Migrations会使用全局迁移目录,所有实体管理器的迁移逻辑会混在一起。即使你指定了--em=logs,迁移文件仍会包含所有实体的变更,导致表被重复创建。
需要修改config/packages/doctrine_migrations.yaml,为每个实体管理器配置独立的迁移目录和存储设置:
doctrine_migrations: migrations_paths: 'DoctrineMigrations\Main': '%kernel.project_dir%/migrations/Main' 'DoctrineMigrations\Logs': '%kernel.project_dir%/migrations/Logs' 'DoctrineMigrations\Sys': '%kernel.project_dir%/migrations/Sys' storage: table_storage: table_name: 'doctrine_migration_versions' entity_managers: default: migrations_paths: 'DoctrineMigrations\Main': '%kernel.project_dir%/migrations/Main' storage: table_storage: table_name: 'doctrine_migration_versions' logs: migrations_paths: 'DoctrineMigrations\Logs': '%kernel.project_dir%/migrations/Logs' storage: table_storage: table_name: 'doctrine_migration_versions' sys: migrations_paths: 'DoctrineMigrations\Sys': '%kernel.project_dir%/migrations/Sys' storage: table_storage: table_name: 'doctrine_migration_versions'
然后创建对应的迁移目录:
mkdir -p migrations/Main migrations/Logs migrations/Sys
3. 重新生成并执行迁移
- 清理之前的迁移文件(如果存在):
rm -rf migrations/*.php
- 为每个实体管理器单独生成迁移:
# 生成default实体管理器的迁移 php bin/console doctrine:migrations:diff --em=default # 生成logs实体管理器的迁移 php bin/console doctrine:migrations:diff --em=logs # 生成sys实体管理器的迁移 php bin/console doctrine:migrations:diff --em=sys
- 分别执行每个实体管理器的迁移:
php bin/console doctrine:migrations:migrate --em=default php bin/console doctrine:migrations:migrate --em=logs php bin/console doctrine:migrations:migrate --em=sys
完成以上步骤后,每个实体管理器的迁移只会作用于对应的数据库,不会再出现表重复创建的问题。
内容的提问来源于stack exchange,提问作者Thomas Muench
相关产品推荐
相关产品推荐

