个性化阅读
专注于IT技术分析

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

本文概述

此任务比你想象的要容易实现, 理论上, 你将能够在几分钟之内使用多个数据库(如果你已经构建了实体)。在本文中, 你将学习:

  • 准备数据库并在所需的捆绑包中自行创建实体(本文中将跳过此步骤, 因为你可以自己实现此目的)。
  • 将所需的配置添加到项目中的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选项, 否则运行时将引发错误。

玩得开心

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 3中使用doctrine orm使用多个数据库

评论 抢沙发

评论前必须登录!