Symfony3:如何设置多个连接?

时间:2016-04-22 08:27:11

标签: php orm doctrine-orm mapping symfony

我正在使用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-mapping?我应该删除dql标签并仅在某个实体管理器标签下使用它吗?

3 个答案:

答案 0 :(得分:3)

检查doc here以获取有关学说的配置的完整参考。

检查dql函数的缩进等。

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

希望这个帮助

答案 1 :(得分: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: ~

答案 2 :(得分:0)

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

为了防止它对某人有用,我会发布我所做的事情:

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();

现在你准备好了。

感谢您的帮助。