本文概述
- 连接到数据库
- 原则架构更新和创建
- 最终建议
- 准备数据库并在所需的捆绑包中自行创建实体(本文中将跳过此步骤, 因为你可以自己实现此目的)。
- 将所需的配置添加到项目中的config.yml文件中
- 了解如何使用symfony控制台更新和创建模式
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选项, 否则运行时将引发错误。
推荐阅读
- 在本地PHP项目中使用xampp启用SSL(https协议)
- 如何在Windows中使Visual Studio代码窗口透明
- 如何在WinForms C#中使用NAudio将MP3文件转换为WAV
- 如何在Symfony中使用FOSUserBundle和FOSOAuthServerBundle启用电子邮件和用户名登录
- 如何使用Twig获取路径,实际路由和主机域的规范URL
- Web Api(Symfony 2或3和预检的Angular响应具有无效的HTTP状态代码403)
- 如何在Symfony 3中创建依赖选择(依赖下拉列表)
- 如何使用PHP根据日期计算年龄
- IN3026 游戏技术