2016-05-09 11 views
0

Context

Ich entwickle eine Website, wo ich Daten aus zwei verschiedenen Datenbanken verwenden muß (einem lokal mit vollem Zugang, einem externen auf nur lesen).Mapping Einheiten auf 2 (oder mehr) Datenbanken

Eine der "lokalen" Entitäten muss einer "externen" Entität zugeordnet werden.
Die externe Entität wird ihre Daten nicht geändert haben, da ich diese in der DB sowieso nicht beibehalten kann.

Frage

Gibt es eine Möglichkeit, diese Zuordnung zu markieren, so dass die externe Einheit entlang gezogen wird, wenn ich die lokale Einheit abrufen?

Antwort

1

Kurze Antwort, Nr

Sie können mehrere Datenbankverbindungen eingerichtet und verwendet die gleichen Entitätsklassen für beide. Eine einzelne Entität kann jedoch keine Eigenschaften aufweisen, die unterschiedlichen Datenbanken zugeordnet sind. Möglicherweise haben Sie dort Referenzfelder, aber diese müssen nur Schlüssel sein, die Sie verwenden können, um sie mit der anderen Verbindung nachzuschlagen. Stellen Sie sich beispielsweise folgendes Setup vor:

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 
      customer: 
       driver: '%database_driver2%' 
       host:  '%database_host2%' 
       port:  '%database_port2%' 
       dbname: '%database_name2%' 
       user:  '%database_user2%' 
       password: '%database_password2%' 
       charset: UTF8 

    orm: 
     default_entity_manager: default 
     entity_managers: 
      default: 
       connection: default 
       mappings: 
        AcmeBundle: ~ 
      customer: 
       connection: customer 
       mappings: 
        AcmeBundle: ~ 

Beide Manager verwenden die Entitätsklassen in AcmeBundle. Dann können Sie etwas wie

public function someControllerAction(){ 
    // Get customer from the default connection 
    $customer = $this->getDoctrine() 
        ->getManager() // If no value is provided the default is implied 
        ->getRepository('AcmeBundle:Customer') 
        ->findOneBy([ 
         'id'=>12 
        ]); 

    // Get the customers details from another connection 
    $customerDetails = $this->getDoctrine() 
          ->getManager('customer') 
          ->getRepository('AcmeBundle:CustomerDetails') 
          ->findOneBy([ 
           'customer_details_id' => $customer->getDetailsId() 
          ]); 
    ... 
} 
tun
Verwandte Themen