2012-02-16 3 views
12

Я пытаюсь работать с двумя менеджерами сущностей для одного и того же пакета. Моя конфигурация такова:Работа с двумя менеджерами сущностей в том же пакете в Symfony2

orm: 

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

Есть ли способ сообщить, кто имеет право принадлежать кому-либо менеджеру? Теперь он падает, если я хочу работать со столовой, которая не относится к менеджеру сущностей по умолчанию.

Благодаря

  • UPDATE

вот моя конфигурация для подключения:

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

Пожалуйста, пост простой пример того, что происходит сбой. Оба ваших соединения указывают на одну и ту же базу данных? Похоже, вы также должны иметь auto_generate_proxy_classes и, возможно, auto_mapping, но, возможно, нет. Попробуйте «php app/console doctrine: mapping: info --em» с первым, а затем другим менеджером сущностей. – Cerad

+0

Привет! Я использую две разные базы данных с двумя разными соединениями. Отображение: info говорит, что у меня нет сущностей, обработанных менеджером сущностей по умолчанию, все мои сущности обрабатываются electra. – gabrielthorn

+0

Это означает, что у вас есть проблема с конфигурацией. Пожалуйста, разместите сопоставления соединений. doctrine: mapping: info должен возвращать тот же список объектов для обеих em. Убедитесь, что у вас есть строка auto_generate и что вы работаете в режиме разработки. – Cerad

ответ

22

Для использования нескольких сущ. -мандера в том же пакете у вас есть параметры сопоставления конфигурации для каждого entitymanager.

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

Exemple от конфигурационного файла

 
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" 

Теперь вы можете использовать консоль для управления БД с параметром --em

Ex: обновление базы для магазина EntityManager

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

Прочитать картографическую информацию из вашего \ Bundle \ En Tity \ SecondDb

Ex: обновление базы по умолчанию EntityManager

php app/console doctrine:schema:update 

Чтение отображение информации с вашего \ Bundle \ Entity \ FirstDb

+0

Спасибо. Ваш ответ сработал очень хорошо. Это должно быть принято! – Heyfara

+0

Спасибо, и извините за поздний комментарий. – gabrielthorn

+1

Поскольку это принятый ответ, обратите внимание, что в более новой версии Symfony вам нужно избежать обратных косых черт в префиксе: «Your \\ Bundle \\ Entity \\ SecondDb», иначе это не сработает. – tomazahlin

2

Ok. Пытался отредактировать исходный пост, но он ждет рецензирования. Не уверен, сколько времени это займет. Попробуйте изменить конфигурации для:

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

Теперь полностью сдуть кэш просто чтобы быть уверенным, а затем запустить:

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

Вы должны получить одинаковые результаты. Я тестировал это на своей системе, поэтому я уверен, что если вы этого не сделаете, у вас будет какая-то опечатка.

Так картографическая информация работает. Следующий шаг - убедиться, что обе базы данных соответствуют вашей схеме сущности. Так и сделайте так:

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

Не должно производиться никакого выхода. Если это так, значит, ваша база данных не соответствует вашим объектам, и ее необходимо разрешить (возможно, используя параметр -force), прежде чем запросы будут работать.

После того, как базы данных находятся в синхронизации, вам, вероятно, следует использовать doctrine: query: dql и выполнить тестовый запрос для обоих менеджеров. Затем вернитесь в свой код.

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

It теперь понимается, что реальная цель состоит в том, чтобы два менеджера сущностей указывали на один и тот же набор объектов, но каким-то образом указывали, что каждый менеджер объектов должен ограничиться определенным набором этих объектов. И это не то, что S2 поддерживает из коробки.

Вы можете ознакомиться с руководством по Doctrine и посмотреть, как он обрабатывает метаданные объекта и, возможно, что-то сделать с этим, но это может усложниться.

Единственная вещь, которую предлагает S2 - это возможность привязать диспетчер сущности ко всем сущностям в одном или нескольких пакетах с использованием атрибута сопоставления. Если вы хотели бы поделиться тремя из семи объектов из одного пакета с другим пакетом, тогда вы просто воссоздаете эти объекты во втором комплекте. Возможно, расширив класс, чтобы избежать дублирования кода.

Я думаю, вы можете немного изменить свой подход. Если у вас есть набор основных объектов, совместно используемых с несколькими пакетами, тогда поместите их в свой собственный пакет. Затем каждый из них на пучке может добавлять дополнительные сущности.

+0

Обновлен мой ответ с помощью новой конфигурации, чтобы попробовать – Cerad

+0

Теперь отображение кажется прекрасным, я вижу те же объекты для двух менеджеров сущностей. Тем не менее, я получаю ту же ошибку, где бы я ни пытался получить доступ к чему-то в electra, он говорит: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 't0.country_code' в 'списке полей' 500 Внутренняя ошибка сервера - PDOException таблица стран находится в режиме электропитания db, а не с номером по умолчанию. – gabrielthorn

+0

Обновленный ответ, основанный на том факте, что оба менеджера видят одни и те же объекты. – Cerad

Смежные вопросы