首页 > 解决方案 > Symfony 使用多个实体

问题描述

我用 Doctrine 为一家公司写了一个 Symfony 5.0 应用程序。应用程序需要管理两个相同的数据库,这些数据库不能折叠在一个数据库中。正如我编辑的官方文档中所建议的那样:教义.yaml

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                url: '%env(resolve:DATABASE_URL_FAU)%'
                driver: 'pdo_mysql'
                server_version: '8.0'
            cef:
                url: '%env(resolve:DATABASE_URL_CEF)%'
                driver: 'pdo_mysql'
                server_version: '8.0'

    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: Fau
            cef:
                connection: cef
                mappings:
                    Cef:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: Cef                                              

然后编辑我的所有控制器的功能,以这种方式设置实体管理器和存储库:

$em = $this->getDoctrine()->getManager($this->security->getUser()->getEnte());

$gruppiRepository = $em->getRepository(Gruppi::class, $this->security->getUser()->getEnte());

getRepository 和 getManager 的第二个参数正确返回辅助实体管理器连接的名称(“cef”)。但我总是从“默认”中得到结果。

这是实体 Manager 的 dd($em):

GruppiController.php on line 95:
Doctrine\ORM\EntityManager {#714 ▼
  -config: Doctrine\ORM\Configuration {#596 ▶}
  -conn: Doctrine\DBAL\Connection {#712 ▼
    #_conn: null
    #_config: Doctrine\DBAL\Configuration {#703 ▶}
    #_eventManager: Symfony\Bridge\Doctrine\ContainerAwareEventManager {#707 ▶}
    #_expr: Doctrine\DBAL\Query\Expression\ExpressionBuilder {#713 ▶}
    -isConnected: false
    -autoCommit: true
    -transactionNestingLevel: 0
    -transactionIsolationLevel: null
    -nestTransactionsWithSavepoints: false
    -params: array:11 [▼
      "url" => "mysql://root:1234@127.0.0.1:3306/fgc_cef"
      "driver" => "pdo_mysql"
      "host" => "127.0.0.1"
      "port" => "3306"
      "user" => "root"
      "password" => "1234"
      "driverOptions" => []
      "serverVersion" => "8.0"
      "defaultTableOptions" => array:1 [▶]
      "dbname" => "fgc_cef"
      "charset" => "utf8mb4"
    ]
    -platform: null
    #_schemaManager: null
    #_driver: Doctrine\DBAL\Driver\PDOMySql\Driver {#709}
    -isRollbackOnly: false
    #defaultFetchMode: 2
  }
  -metadataFactory: Doctrine\ORM\Mapping\ClassMetadataFactory {#715 ▶}
  -unitOfWork: Doctrine\ORM\UnitOfWork {#716 ▶}
  -eventManager: Symfony\Bridge\Doctrine\ContainerAwareEventManager {#707 ▶}
  -proxyFactory: Doctrine\ORM\Proxy\ProxyFactory {#722 ▶}
  -repositoryFactory: Doctrine\Bundle\DoctrineBundle\Repository\ContainerRepositoryFactory {#590 ▶}
  -expressionBuilder: null
  -closed: false
  -filterCollection: null
  -cache: null
}

所以,数据库连接是正确的......但我仍然从“默认”获得结果。$gruppiRepository 也一样。

我不想编辑我的实体文件夹结构,将相同的实体文件放在两个单独的目录中。

我该怎么办?

此致,

GV

[编辑] 我这样解决了:在每个存储库中创建一个新函数

public function setEntityManager(EntityManagerInterface $entityManager): self
    {
        $this->_em = $entityManager;

        return $this;
    }

然后更改每个存储库调用(例如,如果您想执行 findAll():

        $em = $this->getDoctrine()->getManager($this->security->getUser()->getEnte());
        $gruppi = $em->getRepository(Gruppi::class)->setEntityManager($em)->findAll();

标签: symfonydoctrine-orm

解决方案


推荐阅读