2012-02-16 9 views
12

Próbuję pracować z dwoma menedżerami encji dla tego samego pakietu. Moja konfiguracja wygląda następująco:Praca z dwoma menedżerami podmiotów w tym samym pakiecie w Symfony2

orm: 

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

Czy jest jakiś sposób, aby powiedzieć, do której grupy należą menedżer podmiotu? To zawiesza się teraz, jeśli chcę pracować z tabelą, która nie należy do domyślnego menedżera encji.

Dzięki

  • UPDATE

oto moja konfiguracja połączenia:

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

proszę pisać prosty przykład tego, co jest upaść. Oba połączenia wskazują na tę samą bazę danych? Wygląda na to, że powinieneś mieć również auto_generate_proxy_classes i może auto_mapping, ale może nie. Wypróbuj "php app/console doctrine: mapping: info --em" z pierwszym, a następnie innym menedżerem encji. – Cerad

+0

Cześć! Używam dwóch różnych baz danych z dwoma różnymi połączeniami. Mapowanie: informacje mówią, że nie mam żadnych podmiotów obsługiwanych przez domyślnego menedżera jednostek, wszystkie moje jednostki są obsługiwane przez elektrę. – gabrielthorn

+0

To oznacza, że ​​masz gdzieś problem z konfiguracją. Opublikuj swoje mapowania połączeń. doktryna: mapowanie: informacje powinny zwracać tę samą listę elementów dla obu ems. Upewnij się, że masz linię auto_generate i że pracujesz w trybie programowania. – Cerad

Odpowiedz

22

Aby korzystać z wielu podmiotów zależnych w tym samym pakiecie, należy skonfigurować opcje mapowania dla każdego podmiotu uprawnionego.

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

Exemple wyłączyć plik konfiguracyjny

 
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: 
         # you must specify the type 
         type:  "annotation"  
         # The directory for entity (relative to bundle path) 
         dir:  "Entity/FirstDb"   
         #the prefix 
         prefix: "Your\Bundle\Entity\FirstDb" 
      shop: 
       connection:  second 
       mappings: 
        YourBundle: 
         type: "annotation" 
         #here the second path where entity for the connection stand 
         dir: "Entity/SecondDb" 
         #the prefix 
         prefix: "Your\Bundle\Entity\SecondDb" 

Teraz można użyć konsoli do zarządzania db z --em parametru

Ex: Aktualizacja bazy danych do sklepu EntityManager

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

Odczytywanie informacji o odwzorowaniach z folderu \ Bundle \ En Tity \ SecondDb

Ex: Aktualizacja bazy danych do domyślnego EntityManager

php app/console doctrine:schema:update 

informacje odczytane z Twojego mapowanie \ Bundle \ Entity \ FirstDb

+0

Dzięki. Twoja odpowiedź działała dobrze. To powinno zostać zaakceptowane! – Heyfara

+0

Dziękuję i przepraszam za spóźniony komentarz. – gabrielthorn

+1

Skoro jest to zaakceptowana odpowiedź, zwróć uwagę, że w nowszej wersji Symfony musisz uciec przed ukośnikami w prefiksie w ten sposób: "Twój \\ Pakiet \\ Jednostka \\ SecondDb", w przeciwnym razie to nie zadziała. – tomazahlin

2

OK. Próbowałem edytować pierwotny wpis, ale czeka on na sprawdzenie. Nie wiesz, jak długo to potrwa. Spróbuj zmienić config:

doctrine: 
    dbal: 
     default_connection:  default 
     connections: 

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

     # Make an explicit connection just for clarity 
     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: 
     # Humor me and add these 
     auto_generate_proxy_classes: %kernel.debug% 
    # auto_mapping: true 

    default_entity_manager: electra 
    entity_managers: 

    # Make an explicit old_project em so default does not confuse us 
    old_project: 
     connection:  old_project 
     mappings: 
      XXDemoBundle: ~ 

    electra: 
     connection:  electra 
     mappings: 
      XXDemoBundle: ~ 


    default: 
     connection:  default 
     mappings: 
      XXDemoBundle: ~ 

Teraz całkowicie zdmuchnąć pamięć podręczną po prostu mieć pewność, następnie uruchom:

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

Powinieneś dostać identyczne wyniki. Przetestowałem to na moim systemie, więc jestem całkiem pewien, że jeśli nie, to masz gdzieś literówkę.

Informacje o odwzorowaniu działają. Następnym krokiem jest sprawdzenie, czy obie bazy danych są zgodne ze schematem jednostki. Zrób to:

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

Żadne z nich nie powinno wytwarzać żadnych wyników. Jeśli tak się stanie, oznacza to, że twoja baza danych nie pasuje do twoich jednostek i musi zostać rozwiązana (prawdopodobnie za pomocą opcji --force), zanim zapytania będą działać.

Gdy bazy danych są zsynchronizowane, powinieneś prawdopodobnie użyć doctrine: query: dql i wykonać zapytanie testowe dla obu menedżerów. Następnie wróć do swojego kodu.

=========================================

It zrozumiałe jest, że prawdziwym celem jest, aby dwaj menedżerowie podmiotów wskazywali na ten sam zestaw podmiotów, ale w jakiś sposób wskazują, że każdy podmiot zarządzający powinien ograniczyć się do określonego zbioru tych podmiotów. A to nie jest coś, co S2 obsługuje po wyjęciu z pudełka.

Można zajrzeć do podręcznika Doktryny i zobaczyć, jak radzi sobie z metadanymi podmiotu i może zrobić coś z tym, ale to może się skomplikować.

Jedyną rzeczą, którą S2 naprawdę oferuje, jest możliwość powiązania menedżera encji ze wszystkimi jednostkami w jednym lub wielu pakietach za pomocą atrybutu odwzorowania. Jeśli chcesz podzielić się powiedzą trzema z siedmiu elementów z jednego pakietu z innym pakietem, po prostu odtworzysz te elementy w drugim pakiecie. Prawdopodobnie poprzez rozszerzenie klasy, aby uniknąć powielania kodu.

Myślę, że możesz nieco zmienić swoje podejście. Jeśli masz zestaw podstawowych elementów współużytkowanych z wieloma pakietami, umieść je w ich własnym pakiecie. Każdy następny pakiet może następnie dodać dodatkowe elementy.

+0

Zaktualizowałem moją odpowiedź za pomocą nowej konfiguracji do wypróbowania – Cerad

+0

Teraz mapowanie wydaje się w porządku, widzę te same elementy dla dwóch menedżerów encji. Jednak pojawia się ten sam błąd wszędzie tam, gdzie próbuję uzyskać dostęp do czegoś w electra, to mówi: SQLSTATE [42S22]: Kolumna nie znaleziona: 1054 Nieznana kolumna "t0.country_code" w "liście pól" 500 Wewnętrzny błąd serwera - PDOException Tabela krajów znajduje się w systemie elektra db, a nie w konfiguracji z domyślnym połączeniem – gabrielthorn

+0

Zaktualizowana odpowiedź oparta na tym, że obaj menedżerowie widzą te same obiekty. – Cerad

Powiązane problemy