如何与多个实体管理器和连接工作

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何与多个实体管理器和连接工作

您可以在Symfony应用程序中使用多个Doctrine实体管理器或连接。ob娱乐下载如果您使用不同的数据库,甚至使用完全不同的实体集的供应商,这是必要的。换句话说,连接到一个数据库的一个实体管理器将处理一些实体,而连接到另一个数据库的另一个实体管理器可能处理其余的实体。也可以使用多个实体管理器来管理一组公共实体,每个实体都有自己的数据库连接字符串或单独的缓存配置。

请注意

使用多个实体管理器的配置并不复杂,但比较高级,通常不需要。在添加这个复杂层之前,请确保您确实需要多个实体管理器。

谨慎

实体不能跨不同的实体管理器定义关联。如果你需要,这里有几个选择这需要一些自定义设置。

下面的配置代码展示了如何配置两个实体管理器:

  • YAML
  • XML
  • PHP
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#配置/包/ doctrine.yaml原则:dbal:default_connection:默认的连接:默认值:#配置你的数据库服务器url:' % env(解决:DATABASE_URL) %司机:“pdo_mysql”server_version:“5.7”字符集:utf8mb4顾客:#配置你的数据库服务器url:' % env(解决:DATABASE_CUSTOMER_URL) %司机:“pdo_mysql”server_version:“5.7”字符集:utf8mb4orm:default_entity_manager:默认的entity_managers:默认值:连接:默认的映射:主要:is_bundle:类型:注释dir:' % kernel.project_dir % / src /实体/主要的前缀:“主要应用实体\ \”别名:主要顾客:连接:客户映射:顾客:is_bundle:类型:注释dir:' % kernel.project_dir % / src /实体/客户的前缀:“应用程序实体\ \客户”别名:客户

在本例中,您定义了两个实体管理器并调用了它们默认的而且客户.的默认的实体管理器管理src /实体/主要目录,而客户实体管理器管理中的实体src /实体/客户.您还定义了两个连接,一个用于每个实体管理器,但是您可以自由地为两者定义相同的连接。

谨慎

当使用多个连接和实体管理器时,您应该明确需要哪种配置。如果你忽略连接或实体管理器的名称,默认的(即。默认的)。

如果你用不同的名字默认的的默认实体管理器中重新定义默认实体管理器刺激环境配置和Doctrine migrations配置(如果你使用的话):

1 2 3 4 5 6
#配置/包/刺激/ doctrine.yaml原则:orm:default_entity_manager:'您的默认实体管理器名称'#……
1 2 3 4
#配置/包/ doctrine_migrations.yamldoctrine_migrations:#……新兴市场:'您的默认实体管理器名称'

当使用多个连接创建数据库时:

1 2 3 4 5
只在“默认”连接下播放PHP bin/控制台原则:数据库:创建#只与“客户”连接PHP bin/console原则:database:create——connection=customer

当与多个实体管理器一起生成迁移时:

1 2 3 4 5 6 7
#只播放“默认”映射PHP bin/控制台原则:迁移:diffPHP bin/控制台原则:迁移:迁移#只播放“客户”映射PHP bin/控制台原则:migrations:diff——em=customerPHP bin/控制台原则:migrations:migrate——em=customer

如果你在请求时省略实体管理器的名称,默认的实体管理器(即。默认的)返回:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /控制器/ UserController.php名称空间应用程序控制器/ /……使用学说ORMEntityManagerInterface用户控件扩展AbstractController公共函数指数(EntityManagerInterfaceentityManager:响应//这些方法也返回默认的实体管理器,但它是首选的//通过在action方法中注入EntityManagerInterface来获取它entityManager->getDoctrine ()->getManager ();entityManager->getDoctrine ()->getManager (“默认”);entityManager->get (“doctrine.orm.default_entity_manager”);//两者都返回"customer"实体管理器customerEntityManager->getDoctrine ()->getManager (“客户”);customerEntityManager->get (“doctrine.orm.customer_entity_manager”);/ /……}}

您现在可以像以前一样使用Doctrine -使用默认的实体管理器来持久化和获取它所管理的实体客户实体管理器来持久化和获取它的实体。

这同样适用于存储库调用:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/ / src /控制器/ UserController.php名称空间应用程序控制器使用AcmeStoreBundle实体客户使用AcmeStoreBundle实体产品/ /……用户控件扩展AbstractController公共函数指数():响应//检索由"default" em管理的存储库产品->getDoctrine ()->getRepository(产品::类)->findAll ();//处理“默认”em的显式方法产品->getDoctrine ()->getRepository(产品::类,“默认”->findAll ();//检索由"customer" em管理的存储库客户->getDoctrine ()->getRepository(客户::类,“客户”->findAll ();/ /……}}

谨慎

一个实体可以由多个实体管理器管理。然而,当从扩展时,这会导致意外的行为ServiceEntityRepository在自定义存储库中。的ServiceEntityRepository始终为该实体使用配置的实体管理器。

为了修复这种情况,请扩展EntityRepository相反,不再依赖于autowiring:

1 2 3 4 5 6 7 8 9
/ / src /仓库/ CustomerRepository.php名称空间应用程序存储库使用学说ORMEntityRepositoryCustomerRepository扩展EntityRepository/ /……

您现在应该总是使用ManagerRegistry: getRepository ()

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。