在Symfony 5中从多个数据库中恢复数据的问题。

问题描述 投票:0回答:1

我按照Symfony的建议为两个数据库创建了两个连接。https:/symfony.comdoccurrentdoctrinemultiple_entity_manager.html。

我使用Symfony 5.0。

我配置了两个实体管理器。

# config/packages/doctrine.yaml
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'     #bdd-main
            erp:
                url: '%env(DATABASE_ERP_URL)%'         #bdd-erp

    orm:
        auto_generate_proxy_classes: true
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                mappings:
                    Main:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: Main
            erp:
                connection: erp
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                mappings:
                    Erp:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/EntityErp'
                        prefix: 'App\EntityErp'
                        alias: Erp

为了测试,我在EntityErp中创建了一个Toto对象(所以数据库为 "bdd-erp")。

当我试图保存一个对象,我可以做到这一点。

    $erpEntityManager = $this->getDoctrine()->getManager('erp');
    $toto = new Toto();
    $toto->setName('Toto');
    $erpEntityManager->persist($toto);
    $erpEntityManager->flush();

在数据库 "bdd-erp "中,对象是存在的。

但是,当我只想恢复所有的对象时,它不能工作。

$totos = $this->getDoctrine()
        ->getRepository(Toto::class, 'erp')
        ->findAll();

它试图连接到错误的数据库,所以我有这个错误。

An exception occurred while executing 'SELECT t0.id AS id_1, t0.name AS name_2 FROM Toto t0':

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'bdd-erp.toto' doesn't exist

编辑:我试过了,但还是同样的问题。

$emErp = $this->getDoctrine()->getManager('erp');  
$totos = $emErp->getRepository(Toto::class)->findAll();

我不明白,我到底做错了什么?

==> EDIT - 解决方案 : 我找到了解决办法。最后是Symfony 5.I的一个异常 将实体文件夹重命名为 "ErpEntity"。 (而不是 "EntityErp"),然后它就工作了(我之前试过'App\Entity\Erp',但还是错误)。很奇怪,但我可以关闭这个帖子。

php mysql symfony doctrine multi-database
1个回答
1
投票

我找到了解决办法。我把实体文件夹重命名为 "ErpEntity"(而不是 "EntityErp"),然后就可以了。很奇怪,但我可以关闭这个帖子。


0
投票

连接从你的实体管理器开始,所以你应该这样做。

$em1 = $this->getDoctrine()->getManager();
$em2 = $this->getDoctrine()->getManager('erp');

$em1是你默认的第一个数据库 $em2是第二个数据库(Erp)

然后这样构造你的查询。

$totos = $em2->getRepository(Toto::class)->findAll();
© www.soinside.com 2019 - 2024. All rights reserved.