【问题标题】:Doctrine 2 - Multiple databases configuration and useDoctrine 2 - 多数据库配置和使用
【发布时间】:2012-07-02 17:44:28
【问题描述】:

我有一个带有 MySQL 数据库的 Symfony2 项目:

#app/config/config.yml
doctrine:
    dbal:
        driver:   %database_driver%    # <
        host:     %database_host%      # |
        port:     %database_port%      # | Defined in
        dbname:   %database_name%      # | parameters.ini
        user:     %database_user%      # |
        password: %database_password%  # <

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

现在我想对另一个数据库进行简单的查询(如例行调用)。

我应该在配置文件中定义另一个 dbal 吗?
如果是,如何在保持项目默认连接的同时进行配置?
我必须为每个连接配置一个 orm 吗?

【问题讨论】:

    标签: php orm symfony doctrine-orm


    【解决方案1】:

    您需要添加另一个级别的配置并使用multiple entity managers,因为 Doctrine 每个数据库连接使用 1 个实体管理器..您的配置可能如下所示:

    doctrine:
        dbal:
          connections:
            default:
              driver:   %database_driver%    # <
              host:     %database_host%      # |
              port:     %database_port%      # | Defined in
              dbname:   %database_name%      # | parameters.ini
              user:     %database_user%      # |
              password: %database_password%  # <
            another:
              driver:   %database2_driver%    # <
              host:     %database2_host%      # |
              port:     %database2_port%      # | Defined in
              dbname:   %database2_name%      # | parameters.ini
              user:     %database2_user%      # |
              password: %database2_password%  # <
    

    然后你定义你的多个实体管理器

    doctrine:
        orm:
            default_entity_manager:   default
            entity_managers:
                default:
                    connection:       default
                    mappings:
                        AcmeDemoBundle: ~
                        AcmeStoreBundle: ~
                another:
                    connection:       another
                    mappings:
                        AcmeCustomerBundle: ~
    

    然后在您的操作中,您可以使用以下内容来获取正确的实体管理器:

    $em = $this->get('doctrine')->getEntityManager('default');
    $em = $this->get('doctrine')->getEntityManager('another');
    

    取决于您需要哪个实体管理器

    【讨论】:

    • 正是我正在寻找的。顺便说一句,我必须为每个连接定义一个实体管理器吗?我只会从其他连接调用例程。
    • 每个连接都需要一个实体管理器是的......如果你不打算使用它,你为什么要设置连接?
    • 事实上,在我的another 连接之前,我使用的是auto_mapping: true,我不需要管理来自another 连接的任何实体。我想我将不得不使用$this-&gt;get('doctrine.dbal.another_connection') 并保持entity_managers 为空
    • @PierredeLESPINAY 你可以试试看……说实话……但如果那样的话,请告诉我……
    • 似乎有效。我只保留了auto_mapping: true,它似乎仍然可以很好地映射主要数据。
    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多