Symfony3: Как установить несколько подключений?
Я работаю с приложением Symfony3 и хочу настроить несколько подключений к разным базам данных.
Я осмотрелся и нашел документацию о EntityManagers и подключениях к БД. Мой файл config.yml настроен следующим образом:
Конфигурация.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
mapping_types:
enum: string
other:
driver: pdo_mysql
host: "%database_host2%"
port: "%database_port2%"
dbname: "%database_name2%"
user: "%database_user2%"
password: "%database_password2%"
charset: UTF8
mapping_types:
enum: string
orm:
dql:
string_functions:
DAY: DoctrineExtensions\Query\Mysql\Day
MONTH: DoctrineExtensions\Query\Mysql\Month
YEAR: DoctrineExtensions\Query\Mysql\Year
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
Так что теперь я могу получить доступ к своей базе данных следующим образом:
$con2 = $this->get('doctrine.dbal.other_connection');
$orders = $con2->fetchAll('SELECT * FROM orders');
Но что мне действительно нужно, так это настроить второе соединение с отображением orm, которое позволит мне взаимодействовать с сущностями вместо работа со второй базой данных напрямую. Итак, опять же, как говорится в документации, я добавил под ярлыком doctrine orm:
orm:
dql:
string_functions:
DAY: DoctrineExtensions\Query\Mysql\Day
MONTH: DoctrineExtensions\Query\Mysql\Month
YEAR: DoctrineExtensions\Query\Mysql\Year
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
AppBundle: ~
other:
connection: other
mappings:
OtherBundle: ~
Это создает исключение:
Исключение синтаксического анализа в Parser.php строка 296: Невозможно выполнить синтаксический анализ в строке 78 (рядом с "entity_managers:").
Как мне настроить файл config.yml, чтобы разрешить сопоставление orm для моего второго подключения к базе данных? Должен ли я удалить метку dql и использовать ее только под определенной меткой менеджера сущностей?
3 answers
Попробуйте вот это:
doctrine:
orm:
auto_generate_proxy_classes: true
entity_managers:
default:
mappings:
AppBundle: ~
naming_strategy: doctrine.orm.naming_strategy.underscore
dql:
string_functions:
DAY: DoctrineExtensions\Query\Mysql\Day
other:
mappings:
OtherBundle: ~
Проверьте документ здесь для получения полной информации о конфигурации доктрины.
Проверьте отступ функции dql и т.д.
Вероятно, мы используем Сокращенный синтаксис конфигурации, где все доступные параметры могут быть размещены непосредственно на уровне конфигурации doctrine.orm.
Надеюсь, это поможет
Я решил эту проблему. Спасибо за ответы, потому что они в значительной степени были решением. Мне просто нужно было использовать метки на их правильных уровнях.
На всякий случай, если это может быть кому-то полезно, я опубликую то, что я сделал:
Конфигурация.yml
orm:
entity_managers:
default:
mappings:
AppBundle: ~
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
dql:
string_functions:
DAY: DoctrineExtensions\Query\Mysql\Day
MONTH: DoctrineExtensions\Query\Mysql\Month
YEAR: DoctrineExtensions\Query\Mysql\Year
other:
mappings:
OtherBundle: ~
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_generate_proxy_classes: "%kernel.debug%"
Как только (другой) менеджер сущностей будет создан, вы просто сможете использовать его в контроллере, как и в случае с em по умолчанию, просто указав имя менеджера сущностей, которое вы используете.
$orders = $this->get('doctrine')
->getRepository('OtherBundle:Orders', 'other')
->findAll();
Теперь вы готовы иди.
Спасибо за вашу помощь.