Работа с двумя менеджерами сущностей в одном комплекте в Symfony2 - PullRequest
12 голосов
/ 16 февраля 2012

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

orm:

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

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

Спасибо

  • ОБНОВЛЕНИЕ

здесьмоя конфигурация для подключения:

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

Ответы [ 2 ]

22 голосов
/ 22 февраля 2013

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

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

Исключить файл конфигурации

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

Пример: обновить базу данных для магазина entitymanager

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

Считать информацию о сопоставлении из Your \ Bundle \ Entity \ SecondDb

Пример: обновить базу данных для менеджера сущностей по умолчанию

php app/console doctrine:schema:update   

Считать информацию сопоставления из Your \ Bundle \ Entity \ FirstDb

2 голосов
/ 16 февраля 2012

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

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 и выполните тестовый запрос для обоих менеджеров.Затем вернитесь в свой код.

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

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

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

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

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

...