2016-04-22 3 views
3

Ich arbeite mit einer Symfony3-App und möchte mehrere Verbindungen zu verschiedenen Datenbanken einrichten.Symfony3: Wie stellen Sie mehrere Verbindungen ein?

Ich habe mich umgesehen und ich habe die Dokumentation über entityManagers und DB-Verbindungen gefunden. Mein config.yml ist wie folgt konfiguriert:

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 

So, jetzt ich tun, um meine Datenbank wie folgt zugreifen können:

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

Aber was ich wirklich brauchen, ist zu konfigurieren eine zweite orm-mapping-verbindung, die es mir ermöglicht, mit entitäten zu interagieren, anstatt mich direkt mit der zweiten datenbank zu beschäftigen. Also noch einmal, wie die Dokumentation sagt habe ich unter der Lehre ORM-Label:

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: ~ 

Dies löst eine Ausnahme aus:

ParseException in Parser.php Linie 296: konnte nicht in Zeile 78 (in der Nähe von "parsen entity_manager: ").

Wie sollte ich meine config.yml konfigurieren, um orm-mapping für meine zweite Datenbankverbindung zuzulassen? Soll ich das dql-Label löschen und nur unter einem bestimmten Entity-Manager-Label verwenden?

+1

Der Fehler bezieht sich auf einen YAML-Syntaxfehler. Dies spiegelt sich jedoch nicht in der Beispielkonfiguration wider, die Sie hier anzeigen. Möglicherweise möchten Sie Ihre vollständige Konfigurationsdatei anzeigen. – xabbuh

Antwort

2

Try this one:

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

Überprüfen Sie die doc here für vollständige Referenz der Konfiguration über die Lehre.

Überprüfen Sie die Vertiefung der dql Funktion usw.

Wahrscheinlich uns die Shortened Configuration Syntax mit dem alle verfügbaren Optionen direkt unter doctrine.orm Config-Ebene platziert werden können.

Hope this Hilfe

0

löste ich das Problem. Danke für die Antworten, denn sie waren so ziemlich die Lösung. Ich musste nur die Etiketten in ihren richtigen Ebenen verwenden.

Für den Fall, kann es für jemanden nützlich sein, ich werde schreiben, was ich getan habe:

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%" 

Sobald die (andere) EntityManager Sie gerade erstellt wird, kann Verwenden Sie es innerhalb eines Controllers genauso wie mit dem Standard-em, indem Sie einfach den Namen des Entity-Managers angeben, den Sie verwenden.

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

Jetzt können Sie loslegen.

Danke für Ihre Hilfe.