如何在symfony 4中为一个方向使用两个实体管理器
我与多个实体经理合作,跟踪Symfony doc, 但是我想对一个目录使用两个实体管理器。 它在findAll或findOneBy查询中工作不正常,它正在显示“默认”实体管理器的结果 在config/packages/doctrine.yaml中:如何在symfony 4中为一个方向使用两个实体管理器,symfony,doctrine-orm,doctrine,symfony4,entitymanager,Symfony,Doctrine Orm,Doctrine,Symfony4,Entitymanager,我与多个实体经理合作,跟踪Symfony doc, 但是我想对一个目录使用两个实体管理器。 它在findAll或findOneBy查询中工作不正常,它正在显示“默认”实体管理器的结果 在config/packages/doctrine.yaml中: dbal: # configure these for your database server default_connection: default connections: default:
dbal:
# configure these for your database server
default_connection: default
connections:
default:
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
url: '%env(DATABASE_URL)%'
blog:
driver: 'pdo_mysql'
server_version: '5.7'
url: '%env(DATABASE_BLOG_URL)%'
charset: utf8mb4
orm:
auto_generate_proxy_classes: true
default_entity_manager: default
entity_managers:
default:
connection: default
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
Main:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: Main
blog:
connection: blog
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
blog:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: blog
在控制器中:
$entityManager = $this->getDoctrine()->getManager('blog');
$University = $entityManager->getRepository(University::class)
->findOneBy(array('Code' => $Code));
是否尝试将第二个DB的名称放入函数getRepository的第二个参数中,如下所示:
$University = $entityManager->getRepository(University::class, 'blog')
->findOneBy(array('Code' => $Code));
更新2:
仅使用此配置,不指定目录,但通过使用此配置,您将有义务使用香草SQL与数据库进行交互:
博客:
连接:博客
命名策略:doctrine.orm.naming\u strategy.下划线
我的最后一个建议是为每个连接创建不同的文件夹实体,并在其中复制相同的实体,这样您就可以正确地使用ORM原则。您是否试图将第二个DB的名称放在函数getRepository的第二个参数中,如下所示:
$University = $entityManager->getRepository(University::class, 'blog')
->findOneBy(array('Code' => $Code));
更新2:
仅使用此配置,不指定目录,但通过使用此配置,您将有义务使用香草SQL与数据库进行交互:
博客:
连接:博客
命名策略:doctrine.orm.naming\u strategy.下划线
我的最后一个建议是为每个连接创建不同的文件夹实体,并在其中复制相同的实体,这样您就可以正确使用ORM原则。我建议将连接作为服务注入控制器并利用自动连线 //控制器
public function testController(YourService $service){
return $service->test();
}
//服务.yml
App\Service\YourService:
public: true
arguments: ['@doctrine.orm.entity_manager','@doctrine.orm.blog']
//src/service/YourService.php
class YourService {
private $blog,$em;
public function __construct(EntityManager $em, EntityManager $blog) {
$this->em = $em
$this->blog = $blog;
}
public function test()
{
//connect to blog
$this->blog->getRepository(your_entity::class)->findAll();
//connect to default
$this->em->getRepository(your_entity::class)->findAll();
}
我建议将连接作为服务注入控制器中,并利用自动布线 //控制器
public function testController(YourService $service){
return $service->test();
}
//服务.yml
App\Service\YourService:
public: true
arguments: ['@doctrine.orm.entity_manager','@doctrine.orm.blog']
//src/service/YourService.php
class YourService {
private $blog,$em;
public function __construct(EntityManager $em, EntityManager $blog) {
$this->em = $em
$this->blog = $blog;
}
public function test()
{
//connect to blog
$this->blog->getRepository(your_entity::class)->findAll();
//connect to default
$this->em->getRepository(your_entity::class)->findAll();
}
出于好奇-这类设计决策的实际案例是什么?@飞行是一个多语言项目,我使用了一个源代码和多个数据库。出于好奇-这类设计决策的实际案例是什么?@飞行是一个多语言项目,我使用了一个源代码和多个数据库。是的,我这样做了,但我得到了相同的结果。是的,我做到了,但我得到了同样的结果。谢谢,我已经将“博客”实体管理器注入到我的存储库中,它与createQueryBuilder一起工作!谢谢,我已经将“博客”实体管理器注入到我的存储库中,它与createQueryBuilder一起工作!