2016-04-22 59 views
3

我正在使用Symfony3應用程序,我想要建立到不同數據庫的多個連接。Symfony3:如何設置多個連接?

我一直在環顧四周,發現有關entitymanagers和數據庫連接的文檔。所以,現在

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 

我可以訪問我的數據庫這樣的:我config.yml配置如下

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

但我真正需要的是配置第二個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: ~ 

這將引發異常:

ParseException的在Parser.php行296: 無法在行78解析(近「所以,再一次爲文檔說我的學說ORM標籤下添加entity_managers:「)。

我應該如何配置我的config.yml以允許我的第二個數據庫連接使用orm映射?我應該刪除dql標籤並僅在特定的實體管理器標籤下使用它嗎?

+1

錯誤與YAML語法錯誤有關。但是,這並不反映在此處顯示的示例配置中。您可能想要顯示完整的配置文件。 – xabbuh

回答

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

檢查doc here以獲取關於原則的配置的完整參考。

檢查DQL等功能

也許我們正在使用的Shortened Configuration Syntax其中所有可用選項可以直接下doctrine.orm配置水平放置的壓痕。

希望這有助於

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

現在你已經準備好了。

感謝您的幫助。