13 Stimmen

Arbeiten mit zwei Entity-Managern im selben Bundle in Symfony2

Ich versuche, mit zwei Entity-Managern für das gleiche Bundle zu arbeiten. Meine Konfiguration sieht so aus:

orm:

    default_entity_manager:   default
    entity_managers:
        electra:
            connection:       electra
            mappings:
                XXDemoBundle: ~
        default:
            connection:       default
            mappings:
                XXDemoBundle: ~

Gibt es einen Weg zu bestimmen, welche Entitäten zu welchem Entity-Manager gehören? Es stürzt ab, wenn ich mit einer Tabelle arbeiten möchte, die nicht zum standardmäßigen Entity-Manager gehört.

  • UPDATE

Hier ist meine Konfiguration für die Verbindung:

doctrine:
    dbal:
        default_connection:       default
        connections:
            default:
                dbname:           old_project
                user:             root
                password:         123123
                host:             1.1.1.1
                port:             1
            electra:
                dbname:           electra
                user:             root
                password:         123123
                host:             2.2.2.2
                port:             2

orm:
    default_entity_manager:   electra
    entity_managers:
        electra:
            connection:       electra
            mappings:
                XXDemoBundle: ~

        default:
            connection:       default
            mappings:
                XXDemoBundle: ~

0 Stimmen

Bitte posten Sie ein einfaches Beispiel dafür, was abstürzt. Zeigen beide Ihrer Verbindungen auf dieselbe Datenbank? Es scheint, als ob Sie auch auto_generate_proxy_classes und vielleicht auto_mapping haben sollten, aber vielleicht auch nicht. Versuchen Sie "php app/console doctrine:mapping:info --em" mit dem ersten und dann dem anderen Entity-Manager.

0 Stimmen

Hallo! Ich verwende zwei verschiedene Datenbanken mit zwei verschiedenen Verbindungen. Die Mapping:info besagt, dass ich keine Entitäten vom Standard-Entitätsmanager behandelt habe, alle meine Entitäten werden von Electra behandelt.

0 Stimmen

Das bedeutet, dass Sie irgendwo ein Konfigurationsproblem haben. Bitte posten Sie Ihre Verbindungszuordnungen. `doctrine:mapping:info` sollte dieselbe Liste von Entitäten für beide EMS zurückgeben. Stellen Sie sicher, dass Sie die `auto_generate`-Zeile haben und dass Sie im Entwicklungsmodus arbeiten.

22voto

rubijn Punkte 506

Für die Verwendung mehrerer Entitymanager im selben Bundle müssen Sie für jeden Entitymanager Mapping-Optionen konfigurieren.

http://symfony.com/doc/current/reference/configuration/doctrine.html

Beispiel einer Konfigurationsdatei

doctrine:
    dbal:
        default\_connection:   default
        connections:
            default:
                driver:   %database\_driver%
                host:     %database\_host%
                port:     %database\_port%
                dbname:   %database\_name%
                user:     %database\_user%
                password: %database\_password%
                charset:  UTF8
            second:
                driver:   %database\_sqlite\_driver%
                host:     ~
                port:     ~
                dbname:   %database\_sqlite\_shop\_name%
                path:     %database\_sqlite\_shop\_name%
                user:     ~
                password: ~
                charset:  UTF8

    orm:
        auto\_generate\_proxy\_classes: %kernel.debug%
        default\_entity\_manager:   default
        entity\_managers:
            default:
                connection:       default
                mappings:
                    YourBundle:
                      # Sie müssen den Typ angeben
                      type:     "annotation"    
                      # Das Verzeichnis für Entity (relativ zum Bundle-Pfad)
                      dir:      "Entity/FirstDb"        
                      # Das Präfix 
                      prefix:   "Your\\Bundle\\Entity\\FirstDb" 
            shop:
                connection:       second
                mappings:
                    YourBundle:
                      type: "annotation"
                      # Hier ist der zweite Pfad, wo sich die Entity für die Verbindung befindet
                      dir: "Entity/SecondDb" 
                      # Das Präfix
                      prefix: "Your\\Bundle\\Entity\\SecondDb" 

Sie können nun die Konsole verwenden, um Ihre Datenbank mit dem --em-Parameter zu verwalten

Zum Beispiel: Datenbank für den Shop-Entitymanager aktualisieren

php app/console doctrine:schema:update --em=shop

Mapping-Informationen von Your\Bundle\Entity\SecondDb lesen

Zum Beispiel: Datenbank für den Standard-Entitymanager aktualisieren

php app/console doctrine:schema:update   

Mapping-Informationen von Your\Bundle\Entity\FirstDb lesen

0 Stimmen

Vielen Dank. Deine Antwort hat perfekt funktioniert. Sie sollte akzeptiert werden!

0 Stimmen

Vielen Dank und entschuldigen Sie bitte den verspäteten Kommentar.

1 Stimmen

Da dies eine akzeptierte Antwort ist, achten Sie bitte darauf, dass Sie in neueren Versionen von Symfony die Rückwärtsschrägstriche im Präfix wie folgt escapen müssen: "Your\\Bundle\\Entity\\SecondDb", sonst funktioniert es nicht.

2voto

Cerad Punkte 46915

Ok. Versuchte, deinen Originalbeitrag zu bearbeiten, aber er wartet auf Peer-Review. Nicht sicher, wie lange das dauert. Versuche deine Konfiguration zu ändern:

doctrine:
    dbal:
        default_connection:       default
        connections:

        default:
            dbname:           old_project
            user:             root
            password:         123123
            host:             1.1.1.1
            port:             1

        # Erstelle eine explizite Verbindung zur Klarheit
        old_project:
            dbname:           old_project
            user:             root
            password:         123123
            host:             1.1.1.1
            port:             1            

        electra:
            dbname:           electra
            user:             root
            password:         123123
            host:             2.2.2.2
            port:             2

    orm:
        # Mach mir den Gefallen und füge diese hinzu
        auto_generate_proxy_classes: %kernel.debug%
    #   auto_mapping: true

    default_entity_manager:   electra
    entity_managers:

    # Erstelle einen expliziten old_project em, damit default uns nicht verwirrt
    old_project:
        connection:       old_project
        mappings:
            XXDemoBundle: ~

    electra:
        connection:       electra
        mappings:
            XXDemoBundle: ~

    default:
        connection:       default
        mappings:
            XXDemoBundle: ~

Lösche nun komplett deinen Cache, um sicher zu gehen, und führe dann aus:

php bin/console doctrine:mapping:info --em electra
php bin/console doctrine:mapping:info --em old_project

Du solltest identische Ergebnisse erhalten. Ich habe das auf meinem System getestet, daher bin ich ziemlich sicher, dass es bei dir auch funktionieren sollte. Solltest du andere Ergebnisse bekommen, hast du wahrscheinlich irgendwo einen Tippfehler.

Das Mapping-Info funktioniert also. Der nächste Schritt besteht darin zu überprüfen, ob beide Datenbanken zu deinem Entitätsschema passen. Mache also das hier:

php bin/console doctrine:schema:update --em electra --dump-sql
php bin/console doctrine:schema:update --em old_project --dump-sql

Keines sollte eine Ausgabe erzeugen. Wenn doch, bedeutet das, dass deine Datenbank nicht mit deinen Entitäten übereinstimmt und das muss gelöst werden (möglicherweise unter Verwendung der --force Option), bevor Abfragen funktionieren.

Sobald die Datenbanken synchron sind, solltest du wahrscheinlich doctrine:query:dql verwenden und eine Testabfrage gegen beide Manager durchführen. Dann gehe zurück in deinen Code.

\=========================================

Es wurde nun verstanden, dass das eigentliche Ziel darin besteht, dass zwei Entitätsmanager auf dasselbe Set von Entitäten verweisen, jedoch auf irgendeine Weise anzeigen, dass jeder Entitätsmanager sich auf eine bestimmte Gruppe dieser Entitäten beschränken sollte. Und das ist etwas, was Symfony 2 nicht direkt unterstützt.

Du könntest das Doctrine-Handbuch durchgehen und sehen, wie es die Entitätsmetadaten verwaltet, und vielleicht etwas damit machen, aber das könnte kompliziert werden.

Das einzige, was Symfony 2 wirklich bietet, ist die Möglichkeit, einen Entitätsmanager an alle Entitäten in einem oder mehreren Bundles mit dem mapping Attribut zu binden. Wenn du zum Beispiel drei von sieben Entitäten aus einem Bundle mit einem anderen Bundle teilen möchtest, würdest du einfach diese Entitäten im zweiten Bundle neu erstellen. Möglicherweise durch Erweiterung der Klasse, um Code-Duplizierung zu vermeiden.

Ich denke, du möchtest vielleicht deine Herangehensweise etwas ändern. Wenn du einen Satz von Kernentitäten hast, die mit mehreren Bundles geteilt werden, dann lege diese in ihr eigenes Bundle. Jedes Folgebündel kann dann zusätzliche Entitäten hinzufügen.

0 Stimmen

Aktualisiert meine Antwort mit der neuen Konfiguration zum Ausprobieren.

0 Stimmen

Jetzt sieht die Zuordnung in Ordnung aus; ich sehe die gleichen Entitäten für die beiden Entity-Manager. Allerdings erhalte ich den gleichen Fehler, wenn ich versuche, auf etwas in Electra zuzugreifen. Es erscheint: SQLSTATE[42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 't0.country_code' in 'Feldliste' 500 Interne Serverfehler - PDOException. Die Ländertabelle befindet sich in der Electra-Datenbank, nicht in der mit der Standardverbindung.

0 Stimmen

Aktualisierte Antwort basierend darauf, dass beide Manager dieselben Entitäten sehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X