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