Я пытаюсь работать с двумя менеджерами сущностей для одного и того же пакета. Моя конфигурация такова:
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: ~
Для использования нескольких entitymanager в том же пакете вы должны настроить параметры сопоставления для каждого entitymanager.
http://symfony.com/doc/current/reference/configuration/doctrine.html
Экземпляр файла конфигурации
доктрина: DBAL: default_connection: по умолчанию соединения: по умолчанию: драйвер:% database_driver% host:% database_host% порт:% database_port% dbname:% database_name% пользователь:% database_user% пароль:% database_password% charset: UTF8 второй: драйвер:% database_sqlite_driver% хост: ~ порт: ~ dbname:% database_sqlite_shop_name% путь:% database_sqlite_shop_name% пользователь: ~ Пароль: ~ charset: UTF8 ORM: auto_generate_proxy_classes:% kernel.debug% default_entity_manager: по умолчанию entity_managers: по умолчанию: соединение: по умолчанию отображения: YourBundle: # вы должны указать тип type: "аннотация" # Каталог для объекта (относительно пучка пакетов) dir: "Entity / FirstDb" # префикс prefix: "Your \ Bundle \ Entity \ FirstDb" магазин: соединение: второе отображения: YourBundle: type: "аннотация" #here второй путь, где объект для подключения dir: "Entity / SecondDb" # префикс prefix: "Your \ Bundle \ Entity \ SecondDb"
Теперь вы можете использовать консоль для управления своим db с параметром -em
Пример: обновить базу данных для магазина entitymanager
php app/console doctrine:schema:update --em=shop
Чтение информации о карте из вашего \ Bundle \ Entity \ SecondDb
Пример: обновить базу данных для сущ.
php app/console doctrine:schema:update
Чтение информации о карте из вашего \ 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 поддерживает из коробки.
Вы можете просмотреть руководство по Doctrine и посмотреть, как он обрабатывает метаданные объекта и, возможно, что-то с этим делать, но это может усложниться.
Единственное, что предлагает S2 – это возможность привязать диспетчер сущности ко всем сущностям в одном или нескольких пакетах, используя атрибут mapping. Если вы хотели бы поделиться тремя из семи объектов из одного пакета с другим пакетом, тогда вы просто воссоздаете эти объекты во втором комплекте. Возможно, расширив класс, чтобы избежать дублирования кода.
Я думаю, вы можете немного изменить свой подход. Если у вас есть набор основных объектов, совместно используемых с несколькими пакетами, тогда поместите их в свой собственный пакет. Затем каждый из них на пучке может добавлять дополнительные сущности.