You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 重新生成并执行迁移

  1. 清理之前的迁移文件(如果存在):
rm -rf migrations/*.php
  1. 为每个实体管理器单独生成迁移:
# 生成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
  1. 分别执行每个实体管理器的迁移:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:25:16