如何与多个实体管理器和连接工作
编辑本页警告:您正在浏览的文档欧宝官网下载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/控制台原则:迁移:diff$PHP bin/控制台原则:迁移:迁移#只播放“客户”映射$PHP bin/控制台原则:migrations:diff——em=customer$PHP 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名称空间应用程序\控制器;/ /……使用学说\ORM\EntityManagerInterface;类用户控件扩展AbstractController{公共函数指数(EntityManagerInterface$entityManager):响应{//这些方法也返回默认的实体管理器,但它是首选的//通过在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名称空间应用程序\存储库;使用学说\ORM\EntityRepository;类CustomerRepository扩展EntityRepository{/ /……}
您现在应该总是使用ManagerRegistry: getRepository ()
.