php - 使用 symfony4 和 doctrine 设置多个数据库时如何修复在两个数据库上运行的迁移

标签 php symfony doctrine yaml symfony-4.2

我正在尝试为 symfony 4.2 项目设置第二个数据库。一切似乎都运行良好,直到我运行迁移,其中所有迁移都在给定连接上执行,而不仅仅是它创建的连接的迁移。

正在关注 symfony's own documentation关于这个,我的 doctrine.yaml 看起来像这样:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
                url: '%env(DATABASE_URL)%'
            logging:
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
                url: '%env(DATABASE_URL_LOG)%'
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: true
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: App
            logging:
                connection: logging
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: false
                mappings:
                    Log:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Log'
                        prefix: 'App\Log'
                        alias: Log

现在有了这个配置,我可以像这样使用 --em=log/default 参数运行迁移命令:

php bin/console doctrine:migrations:diff --em=log
php bin/console doctrine:migrations:migrate --em=log

你得到了预期的结果:当我添加 --em=log 时,它只会为我在 src/Log 中创建的新实体创建一个新的迁移。

这是新实体:

<?php

namespace App\Log;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class LogItem
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;
}

但是,迁移是在默认的 src/Migrations 文件夹中创建的,因此:

1) 当我运行 doctrine:migrations:migrate --em=default (在默认数据库中创建表)时也会执行此迁移

2) 当我运行 doctrine:migrations:migrate --em=log

时,整个默认模式被加载到日志数据库中

所以我认为解决方案是将实体管理器之间的迁移文件拆分到不同的目录中。但是我已经花了几个小时,找不到为 symfony4 做这个的方法。此外,由于 symfony 文档对此完全没有提及,我觉得现在的设置方式可能有问题。

所以谁能告诉我我做错了什么?或者我可以(如果是的话:如何)拆分迁移文件,以便它只执行为给定实体管理器创建的迁移?

最佳答案

doctrine/doctrine-migrations-bundle 不支持开箱即用的多个实体管理器的迁移。此问题有多种解决方法,包括:

  • 容器感知迁移(仅在 Symfony <4 上可行)
  • 分别存储每个实体管理器的迁移配置,并通过 doctrine:migrations:migrate 命令的 --configuration 选项直接传递它(仅当您不这样做时才可行)不需要将服务/依赖项注入(inject)您的迁移)
  • 使用avaibooksports/doctrine-migrations-multiple-database-bundle (或滚动您自己的 bundle ),它实现了对每个实体管理器的单独配置的支持(您可以在其中为每个实体的迁移指定一个单独的目录,并根据需要通过工厂注入(inject)服务)。

有一个开放的GitHub issue (于 2012 年开放)更详细地描述了这些方法。另见 this answer总结一下。

关于php - 使用 symfony4 和 doctrine 设置多个数据库时如何修复在两个数据库上运行的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55711929/

相关文章:

doctrine-orm - 来自 Mysql 的 Doctrine 查询

php - WordPress 插件如何区分 WordPress

php - Symfony2 : How do I Reduce the Amount of Duplicate Logic in My Controller and Stick With the Thin Controller Fat Model Approach?

symfony - 未定义索引 : inverseJoinColumns while trying to define ManyToMany relationship between two entities

symfony - 将安全用户的名称传递给 Symfony2 中 services.yml 中的监听器

php - Doctrine 无关系加入

php - Count Doctrine 的 iterate() Collection Result

php - 无法在另一个 php 文件中添加 navigation.php

php - 如果我不想做 Composer 更新,我只想使用 composer.json 和 composer.lock 中的内容怎么办

php - laravel 迁移 :rollback wrong