0

我正在使用无法更改的旧数据库,并且想要组成一个无法以标准方式 (YAML) 映射的实体,因为相关实体使用与主实体不同的数据库。

据我所见,创建自定义水合方法或将逻辑封装在存储库中都不起作用,因为两者都假设您在特定实体管理器“内部”进行操作(结果将为每个实体使用相同的连接)。我目前正在hydrateResult()使用 Controller 上的私有方法解决这个问题,但我真的不喜欢这样做。

有没有人有什么好主意?感觉这类问题正是 ORM 应该帮助解决的问题,而不是加剧!

4

1 回答 1

0

假设您的所有模式都在同一数据库服务器上运行,那么您可以通过在映射期间将模式名称作为表名的一部分加入多个模式:

Cerad\Bundle\AccountBundle\Entity\User:
    type:  entity
    table: schema1.account_user

Cerad\Bundle\AccountBundle\Entity\SomeName:
    type:  entity
    table: schema2.some_name

这不是一个很好的解决方案,因为它破坏了大部分的原则:模式命令。但是查询会起作用。

如果您有多个服务器,那么这将不起作用,因为 sql 根本不支持跨多个服务器进行查询。ORM 对此无能为力。

您最好的选择是硬着头皮接受您需要两个实体管理器,并且需要一个额外的查询和一些逻辑来连接两者。这在领域驱动设计领域实际上很常见。从长远来看,甚至可能成为优势。

==============================================

还有一种可能性我忘了提,它甚至可能是一个好主意。您也许可以创建一个连接您的表的 sql 视图。然后,您可以将一个学说实体映射到该视图。视图有其自身的一组限制,因此您可能会也可能无法解决您的问题。

于 2013-08-27T21:28:24.617 回答