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