我们需要将数据库拆分为一个 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])
获取我们的实体
Doctrine 不允许您在不同的 EM 中与同一实体合作。您需要复制实体类并为两个实体显式创建存储库类。并且您需要将正确的 EM 传递给存储库构造函数(使用配置)。 之后,您需要在代码中使用存储库而不是 EM:
$myEntity = $this->myEntityRepository->find(MyEntity::class, 8, LockMode::NONE);
$myArchivedEntity = $this->myArchivedEntityRepository->find(MyArchivedEntity::class, 8, LockMode::NONE);