2013-02-19 75 views
0

我已经在我的ZF2项目中使用Doctrine建立了一个多数据库连接,一个从数据库读取,另一个从数据库读取。ZF2原则共享实体池

找到用户:单独使用时,但是当我尝试在同一实体同时使用,像

一切工作良好

$ USER = $这个 - >getReaderObjectManager() - > getRepository('Entity \ User') - > findOneBy(array('username'=>'xpto'));

,然后尝试改变一些东西:

$这个 - >getWriterObjectManager() - >留存($用户); $ user-> setBlabla('bla');

,然后尝试刷新它:

$这个 - >getWriterObjectManager() - >刷新();

没有发生。不好。

似乎readerObjectManagerwriterObjectManager有自己独立的“实体池”,所以我不能坚持,并从其他经理改变一个实体。

有没有办法将一个实体从一个管理者传递给另一个管理者,或引用它,或者简单地说两个管理者共享相同的“实体库”?

在此先感谢。

回答

1

您不能跨多个实体管理器拥有管理实体:这不受支持,并且可能导致意外的行为。

如果您确实需要将读取与写入分开,请在连接级别使用主/从连接或实现您自己的对象。

此外,通常不通过ObjectManager处理读取,而是通过ObjectRepository(您可以在其中实施定制内存中策略来优化读取操作)处理。

处理此问题的另一种方法是从“读取”ObjectManager中分离实体并将它们合并回“写入”ObjectManager

同样,这并不是建议的,您应该在连接级别处理它,或者更智能地实现符合您需要的存储库。

+0

你能解释一下更多你是什么意思“在连接层面”? – MGP 2013-02-19 18:01:17

+0

这意味着连接对象会决定读取和写入操作(通常发生在主/从环境中)。如果您的问题仅与PHP内存相关,请仅使用非常智能的存储库。 – Ocramius 2013-02-19 18:06:07

+0

唯一的问题是必须从一个数据库中读取数据并在另一个数据库(生产环境设置)中写入数据。那么,创建一个自定义的DBALConnection就行了?或者有没有办法,我可以绕过标准的orm_default连接,在插入/更新操作中更改连接信息“on the fly”basead并选择? – MGP 2013-02-19 18:18:30