【问题标题】:Symfony3: How to set multiple connections?Symfony3:如何设置多个连接?
【发布时间】:2016-04-22 08:27:11
【问题描述】:

我正在使用 Symfony3 应用程序,我想建立到不同数据库的多个连接。

我一直在环顾四周,发现了有关 entityManagers 和 DB 连接的文档。我的 config.yml 配置如下:

config.yml

doctrine:
dbal:
    default_connection: default
    connections:
            default:
                    driver:   pdo_mysql
                    host:     "%database_host%"
                    port:     "%database_port%"
                    dbname:   "%database_name%"
                    user:     "%database_user%"
                    password: "%database_password%"
                    charset:  UTF8
                    mapping_types:
                      enum: string
            other:
                    driver:   pdo_mysql
                    host:     "%database_host2%"
                    port:     "%database_port2%"
                    dbname:   "%database_name2%"
                    user:     "%database_user2%"
                    password: "%database_password2%"
                    charset:  UTF8
                    mapping_types:
                      enum: string
orm:
    dql:
         string_functions:
                DAY:   DoctrineExtensions\Query\Mysql\Day
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR:  DoctrineExtensions\Query\Mysql\Year
    auto_generate_proxy_classes: "%kernel.debug%"
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true

所以现在我可以像这样访问我的数据库了:

$con2 = $this->get('doctrine.dbal.other_connection');
$orders = $con2->fetchAll('SELECT * FROM orders');

但我真正需要的是配置第二个 orm-mapping 连接,这将允许我与实体交互而不是直接处理第二个数据库。因此,正如文档所说,我在学说 orm 标签下添加了:

orm:
    dql:
         string_functions:
                DAY:   DoctrineExtensions\Query\Mysql\Day
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR:  DoctrineExtensions\Query\Mysql\Year
    auto_generate_proxy_classes: "%kernel.debug%"
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true

    default_entity_manager: default
    entity_managers:
        default:
            connection: default
            mappings:
                AppBundle:  ~      
        other:
            connection: other
            mappings:
                OtherBundle: ~

这会引发异常:

Parser.php 第 296 行中的 ParseException: 无法在第 78 行解析(靠近“entity_managers:”)。

我应该如何配置我的 config.yml 以允许我的第二个数据库连接的 orm 映射?是否应该删除dql标签,只在某个实体管理器标签下使用?

【问题讨论】:

  • 该错误与 YAML 语法错误有关。但是,您在此处显示的示例配置并未反映这一点。您可能希望显示完整的配置文件。

标签: php orm doctrine-orm mapping symfony


【解决方案1】:

查看doc here 以获取有关教义配置的完整参考。

检查dql函数的缩进等

可能我们正在使用Shortened Configuration Syntax,其中所有可用的选项都可以直接放在doctrine.orm 配置级别下。

希望有帮助

【讨论】:

    【解决方案2】:

    试试这个:

    doctrine:
        orm:
            auto_generate_proxy_classes: true
            entity_managers:
                default:
                    mappings:
                        AppBundle: ~
                    naming_strategy: doctrine.orm.naming_strategy.underscore
                    dql:
                       string_functions:
                           DAY: DoctrineExtensions\Query\Mysql\Day
                other:
                    mappings:
                        OtherBundle: ~
    

    【讨论】:

      【解决方案3】:

      我解决了这个问题。感谢您的回答,因为它们几乎是解决方案。我只需要使用正确级别的标签。

      以防万一它对某人有用,我会发布我所做的:

      config.yml

       orm:
      
          entity_managers:
              default:
                  mappings:
                      AppBundle: ~
                  naming_strategy: doctrine.orm.naming_strategy.underscore
                  auto_mapping: true
                  dql:
                               string_functions:
                                      DAY:   DoctrineExtensions\Query\Mysql\Day
                                      MONTH: DoctrineExtensions\Query\Mysql\Month
                                      YEAR:  DoctrineExtensions\Query\Mysql\Year
              other:
                  mappings:
                      OtherBundle: ~
                  naming_strategy: doctrine.orm.naming_strategy.underscore
      
          auto_generate_proxy_classes: "%kernel.debug%"
      

      创建(其他)实体管理器后,您只需指定您正在使用的实体管理器名称,就可以在控制器中使用它,就像使用默认 em 一样。

      $orders = $this->get('doctrine')
              ->getRepository('OtherBundle:Orders', 'other')
              ->findAll();
      

      现在你准备好了。

      感谢您的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        • 2019-03-26
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 2014-09-14
        相关资源
        最近更新 更多