Подтвердить что ты не робот

Работа с двумя менеджерами сущностей в том же пакете в 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: ~
4b9b3361

Ответ 1

Для использования нескольких 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" 

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

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

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

Считывание информации о карте из вашего \Bundle\Entity\SecondDb

Ex: обновить базу данных для сущ. лица по умолчанию

php app/console doctrine:schema:update   

Прочитайте картографическую информацию из вашего\Bundle\Entity\FirstDb

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

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

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

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

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

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