如何在Symfony 4中使用两个实体经理来实现一个方向



我正在与多个实体经理一起工作,从这里遵循Symfony Doc,但是我想将两个实体经理用于一个DIR。它在Findall或FindOneby查询中无法正常工作,它显示了"默认"实体管理器的结果。

在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: 'AppEntity'
                    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: 'AppEntity'
                    alias: blog

在控制器中:

    $entityManager = $this->getDoctrine()->getManager('blog');
    $University = $entityManager->getRepository(University::class)
            ->findOneBy(array('Code' => $Code));

我建议将连接注入您的控制器中的服务,并利用Autovering

//控制器

public function testController(YourService $service){
        return $service->test();
}

//services.yml

AppServiceYourService:
    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();
    }

您是否试图将第二个db的名称放在函数的第二个参数中,例如:

$University = $entityManager->getRepository(University::class, 'blog')
            ->findOneBy(array('Code' => $Code));

更新2:

仅使用此配置,而无需指定DIR,但是通过使用此配置,您将使用vanilla sql与您的db相互插入:博客: 连接:博客 naming_strategy:doctrine.orm.naming_strategy.underscore

我的最后建议是为每个连接创建不同的文件夹实体,并在其中复制SAMES实体,并且您可以正确使用ORM学说。

最新更新