如何在Symfony 3中使用doctrine orm使用多个数据库

本文概述

  • 连接到数据库
  • 原则架构更新和创建
  • 最终建议
此任务比你想象的要容易实现, 理论上, 你将能够在几分钟之内使用多个数据库(如果你已经构建了实体)。在本文中, 你将学习:
  • 准备数据库并在所需的捆绑包中自行创建实体(本文中将跳过此步骤, 因为你可以自己实现此目的)。
  • 将所需的配置添加到项目中的config.yml文件中
  • 了解如何使用symfony控制台更新和创建模式
连接到数据库在这种情况下, 我们使用2个数据库, 即默认数据库(ourcodeworld)和分析数据库(analytics), 因此我们需要将这些更改注册到我们的项目中。转到config.yml文件, 并在doctrine属性中更改以下配置:
doctrine:# Configure the abstraction layerdbal:# Set the default connection to defaultdefault_connection: defaultconnections:default:driver:'%default_driver%'host:'%default_host%'port:'%default_port%'dbname:'%default_name%'user:'%default_user%'password: '%default_password%'charset:UTF8analytics:driver:'%analytics_driver%'host:'%analytics_host%'port:'%analytics_port%'dbname:'%analytics_name%'user:'%analytics_user%'password: '%analytics_password%'charset:UTF8# Configure the ORMorm:default_entity_manager: defaultentity_managers:# Register which bundle should use which connectiondefault:connection: defaultmappings:AppBundle:~AnalyticsBundle: ~analytics:connection: analyticsmappings:AnalyticsBundle: ~

确保如果数据库使用凭据, 则这些凭据将与先前配置中的给定凭据相匹配, 以防止出现任何奇怪的错误。至此, 配置就足够了。
也要小心任何现有配置, 例如, 如果你的项目已使用dql扩展名(自定义函数, 例如match_against), 则这些设置需要从dbal全局设置(orm块)中更改, 并将其附加到每个自定义实体管理器中。否则, 你将得到诸如” doctrine.orm” 下无法识别的选项” naming_strategy, auto_mapping, dql” 之类的错误。
仅对于现有项目, 请参见以下示例:
# Doctrine Configurationdoctrine:dbal:# Set the default connection to defaultdefault_connection: defaultconnections:default:driver:'pdo_mysql'host:'127.0.0.1'port:nulldbname:'ourcodeworld'user:'root'password: nullcharset:UTF8analytics:driver:'pdo_mysql'host:'127.0.0.1'port:nulldbname:'analytics'user:'root'password: nullcharset:UTF8orm:auto_generate_proxy_classes: "%kernel.debug%"default_entity_manager: defaultentity_managers:# Register which bundle should use which connectiondefault:naming_strategy: doctrine.orm.naming_strategy.underscoreconnection: defaultauto_mapping: truemappings:AppBundle:~dql:string_functions:MATCH_AGAINST: ourcodeworld\Extensions\Doctrine\MatchAgainstanalytics:naming_strategy: doctrine.orm.naming_strategy.underscoreconnection: analyticsmappings:AnalyticsBundle: ~dql:string_functions:MATCH_AGAINST: ourcodeworld\Extensions\Doctrine\MatchAgainst

现在我们的基本配置已经准备就绪, 你只需要学习如何在控制器上的多个连接中使用实体管理器。你将能够像往常一样操作所有东西, 只需要在getManager函数上使用连接名称指定要用作字符串的第一个参数, 就可以指定要使用的连接。
class AnyofMyController extends Controller{public function anyAction(){// All three return the "default" entity manager$em = $this-> get('doctrine')-> getManager(); $em = $this-> get('doctrine')-> getManager('default'); $em = $this-> get('doctrine.orm.default_entity_manager'); // Both of these return the "analytics" entity manager$analyticsEm = $this-> get('doctrine')-> getManager('analytics'); $analyticsEm = $this-> get('doctrine.orm.analytics_entity_manager'); $analyticItem = $analyticsEm-> getRepository("analyticsBundle:Analytics")-> find(12); // Find an analytics item}}

请注意, 本文假定你将处理数据库的所有设置(数据库设计和实体映射)。
原则架构更新和创建当你使用多个数据库时, 在使用诸如doctrine:database:create和doctrine:schema:update之类的命令时, 你需要在每次执行时提供要执行此任务的连接, 例如:
# Play only with "default" connection$ php bin/console doctrine:database:create# Play only with "analytics" connection$ php bin/console doctrine:database:create --connection=analytics

要更新任何模式, 请使用:
# Play only with "default" mappings$ php bin/console doctrine:schema:update --force# Play only with "analytics" mappings$ php bin/console doctrine:schema:update --force --em=analytics

最终建议
  • 与使用symfony中的默认数据库创建普通连接(通常不需要)相比, 此任务要先进一些。在添加这一层复杂性之前, 请确保你确实需要多个实体管理器(针对现有数据库的外键等)。
  • 如果你在询问时确实省略了实体管理器的名称, 则会返回默认的实体管理器(例如, 默认)。
  • 请记住, 只能为1个实体管理器启用auto_mapping选项, 否则运行时将引发错误。
【如何在Symfony 3中使用doctrine orm使用多个数据库】玩得开心

    推荐阅读