Работа с двумя менеджерами сущностей в одном комплекте в Symfony2

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

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 ответа

Решение

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

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

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

доктрина:
    DBAL:
        default_connection: default
        соединения:
            дефолт:
                драйвер:% database_driver%
                хост:% database_host%
                порт:% database_port%
                dbname:% database_name%
                пользователь:% database_user%
                пароль:% database_password%
                кодировка:  UTF8
            второй:
                драйвер:   %database_sqlite_driver%
                хост:     ~
                порт:     ~
                dbname:   %database_sqlite_shop_name%
                путь:% database_sqlite_shop_name%
                пользователь:     ~
                пароль:     ~
                кодировка:  UTF8

    ORM:
        auto_generate_proxy_classes: %kernel.debug%
        default_entity_manager: по умолчанию
        entity_managers:
            дефолт:
                соединение: по умолчанию
                отображения:
                    YourBundle:
                      # вы должны указать тип
                      тип:     "аннотация"    
                      # Каталог для сущности (относительно пути к пакету)
                      dir:      "Entity/FirstDb"        
                      # префикс 
                      префикс:   "Your\Bundle\Entity\FirstDb" 
            магазин:
                подключение: второе
                отображения:
                    YourBundle:
                      тип:     "аннотация"
                      # здесь второй путь, где сущность для соединения стоит
                      dir: "Entity/SecondDb" 
                      # префикс
                      префикс:     "Ваш \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

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

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 поддерживает из коробки.

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

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

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

Другие вопросы по тегам