如何使用多个连接来水合Doctrine实体

时间:2013-08-27 16:42:07

标签: database symfony doctrine-orm entitymanager

我正在处理一个我无法改变的遗留数据库,并希望编写一个无法以标准方式(YAML)映射的实体,因为相关实体使用与主实体不同的数据库。

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

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

1 个答案:

答案 0 :(得分: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视图。然后,您可以将一个学说实体映射到该视图。视图有其自身的一些限制,因此您可能会或可能不会解决您的问题。

相关问题