使用 Doctrine 与多个实体管理器的缓存问题

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

我们需要将数据库拆分为一个 LIVE 数据库和一个 Archive 数据库

为此,我们创建了一个实时数据库和一个存档数据库,并且我们设置了这样的原则:

doctrine:
  dbal:
    default_connection: default
    connections:
      default:
        url: '%env(resolve:RM_DATABASE_URL)%'
        server_version: mariadb-10.3.20
        charset: UTF8
        mapping_types:
          enum: string
      archive:
        url: '%env(resolve:RM_ARCHIVE_DATABASE_URL)%'
        server_version: mariadb-10.3.20
        charset: UTF8
        mapping_types:
          enum: string
  orm:
    default_entity_manager: default
    auto_generate_proxy_classes: "%kernel.debug%"
    entity_managers:
      default:
        connection: default
        naming_strategy: doctrine.orm.naming_strategy.default
        auto_mapping: true
        mappings:
          App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App
        dql:
          string_functions:
            field: DoctrineExtensions\Query\Mysql\Field
            timestampadd: DoctrineExtensions\Query\Mysql\TimestampAdd
            timediff: DoctrineExtensions\Query\Mysql\TimeDiff
            date_format: DoctrineExtensions\Query\Mysql\DateFormat
            JSON_EXTRACT: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonExtract
      archive:
        connection: archive
        naming_strategy: doctrine.orm.naming_strategy.default
        mappings:
          App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App
        dql:
          string_functions:
            field: DoctrineExtensions\Query\Mysql\Field
            timestampadd: DoctrineExtensions\Query\Mysql\TimestampAdd
            timediff: DoctrineExtensions\Query\Mysql\TimeDiff
            date_format: DoctrineExtensions\Query\Mysql\DateFormat
            JSON_EXTRACT: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonExtract
            metadata_cache_driver: null
            query_cache_driver: null

我们创建了一个使用语句将数据迁移到存档的命令。数据已正确移动,并且我们尝试获取的行位于正确的数据库中

我们尝试了很多方法来从 ARCHIVE 数据库中获取行,例如刷新、清除、持久、删除缓存,但似乎仍然只有这个对我们有用(8 是数据库中项目的 ID):

$entity = $this->archiveEntityManager->find(MyEntity::class, 8, LockMode::NONE);

但是当尝试这样的事情时:

$entity = $this->archiveEntityManager->getRepository(MyEntity::class)->findOneBy(['id' => 8]);

它什么也不返回。

这里我们使用 id 进行测试,但我们想使用

findOneBy(['token' => $myToken])

获取我们的实体
symfony caching mariadb doctrine entitymanager
1个回答
0
投票

Doctrine 不允许您在不同的 EM 中与同一实体合作。您需要复制实体类并为两个实体显式创建存储库类。并且您需要将正确的 EM 传递给存储库构造函数(使用配置)。 之后,您需要在代码中使用存储库而不是 EM:

$myEntity = $this->myEntityRepository->find(MyEntity::class, 8, LockMode::NONE);

$myArchivedEntity = $this->myArchivedEntityRepository->find(MyArchivedEntity::class, 8, LockMode::NONE);

© www.soinside.com 2019 - 2024. All rights reserved.