本文概述
此任务比你想象的要容易实现, 理论上, 你将能够在几分钟之内使用多个数据库(如果你已经构建了实体)。在本文中, 你将学习:
- 准备数据库并在所需的捆绑包中自行创建实体(本文中将跳过此步骤, 因为你可以自己实现此目的)。
- 将所需的配置添加到项目中的config.yml文件中
- 了解如何使用symfony控制台更新和创建模式
连接到数据库
在这种情况下, 我们使用2个数据库, 即默认数据库(ourcodeworld)和分析数据库(analytics), 因此我们需要将这些更改注册到我们的项目中。转到config.yml文件, 并在doctrine属性中更改以下配置:
doctrine:
# Configure the abstraction layer
dbal:
# Set the default connection to default
default_connection: default
connections:
default:
driver: '%default_driver%'
host: '%default_host%'
port: '%default_port%'
dbname: '%default_name%'
user: '%default_user%'
password: '%default_password%'
charset: UTF8
analytics:
driver: '%analytics_driver%'
host: '%analytics_host%'
port: '%analytics_port%'
dbname: '%analytics_name%'
user: '%analytics_user%'
password: '%analytics_password%'
charset: UTF8
# Configure the ORM
orm:
default_entity_manager: default
entity_managers:
# Register which bundle should use which connection
default:
connection: default
mappings:
AppBundle: ~
AnalyticsBundle: ~
analytics:
connection: analytics
mappings:
AnalyticsBundle: ~
确保如果数据库使用凭据, 则这些凭据将与先前配置中的给定凭据相匹配, 以防止出现任何奇怪的错误。至此, 配置就足够了。
也要小心任何现有配置, 例如, 如果你的项目已使用dql扩展名(自定义函数, 例如match_against), 则这些设置需要从dbal全局设置(orm块)中更改, 并将其附加到每个自定义实体管理器中。否则, 你将得到诸如” doctrine.orm”下无法识别的选项” naming_strategy, auto_mapping, dql”之类的错误。
仅对于现有项目, 请参见以下示例:
# Doctrine Configuration
doctrine:
dbal:
# Set the default connection to default
default_connection: default
connections:
default:
driver: 'pdo_mysql'
host: '127.0.0.1'
port: null
dbname: 'ourcodeworld'
user: 'root'
password: null
charset: UTF8
analytics:
driver: 'pdo_mysql'
host: '127.0.0.1'
port: null
dbname: 'analytics'
user: 'root'
password: null
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
# Register which bundle should use which connection
default:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: default
auto_mapping: true
mappings:
AppBundle: ~
dql:
string_functions:
MATCH_AGAINST: ourcodeworld\Extensions\Doctrine\MatchAgainst
analytics:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: analytics
mappings:
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选项, 否则运行时将引发错误。
玩得开心
评论前必须登录!
注册