如何在 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();
    }