如何在 symfony 4 中为一个方向使用两个实体管理器
how to use two entity manager for one direction in symfony 4
我正在与多个实体管理器合作,遵循 here 的 Symfony 文档,
但我想为一个目录使用两个实体管理器。
它在 findAll 或 findOneBy 查询中无法正常工作,它显示 'default' 实体管理器的结果。
在 config/packages/doctrine.yaml 中:
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));
您是否尝试将第二个数据库的名称放入函数 getRepository 的第二个参数中,如下所示:
$University = $entityManager->getRepository(University::class, 'blog')
->findOneBy(array('Code' => $Code));
更新 2:
仅使用此配置,不指定目录,但通过使用此配置,您将有义务使用香草 SQL 与您的数据库交互:
博客:
连接:博客
naming_strategy: doctrine.orm.naming_strategy.underscore
我最后的建议是为每个连接创建不同的文件夹实体,并在其中复制相同的实体,这样您就可以正确使用 ORM DOCTRINE。
我建议将连接作为服务注入到您的控制器中并利用自动装配
//控制器
public function testController(YourService $service){
return $service->test();
}
//services.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();
}
我正在与多个实体管理器合作,遵循 here 的 Symfony 文档, 但我想为一个目录使用两个实体管理器。 它在 findAll 或 findOneBy 查询中无法正常工作,它显示 'default' 实体管理器的结果。
在 config/packages/doctrine.yaml 中:
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));
您是否尝试将第二个数据库的名称放入函数 getRepository 的第二个参数中,如下所示:
$University = $entityManager->getRepository(University::class, 'blog')
->findOneBy(array('Code' => $Code));
更新 2:
仅使用此配置,不指定目录,但通过使用此配置,您将有义务使用香草 SQL 与您的数据库交互: 博客: 连接:博客 naming_strategy: doctrine.orm.naming_strategy.underscore
我最后的建议是为每个连接创建不同的文件夹实体,并在其中复制相同的实体,这样您就可以正确使用 ORM DOCTRINE。
我建议将连接作为服务注入到您的控制器中并利用自动装配
//控制器
public function testController(YourService $service){
return $service->test();
}
//services.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();
}