Я пытаюсь работать с двумя менеджерами сущностей для одного и того же пакета. Моя конфигурация такова:
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. Если вы хотели бы поделиться тремя из семи объектов из одного пакета с другим пакетом, тогда вы просто воссоздаете эти объекты во втором комплекте. Возможно, расширив класс, чтобы избежать дублирования кода.
Я думаю, вы можете немного изменить свой подход. Если у вас есть набор основных объектов, совместно используемых с несколькими пакетами, тогда поместите их в свой собственный пакет. Затем каждый из них на пучке может добавлять дополнительные сущности.