我在我的ZF2项目上使用Doctrine设置了一个多数据库连接,一个用于从数据库读取,另一个用于写入。
当单独使用时,一切都很好,但是当我尝试在同一个实体上使用它们时,例如:
找到用户:
$ user = $ this-> getReaderObjectManager () - > getRepository('Entity \ User') - > findOneBy(array('username'=>'xpto')) ;
然后尝试改变一些事情:
$这 - >的 getWriterObjectManager () - >坚持($用户); $用户> setBlabla( 'BLA');
然后尝试冲洗它:
$这 - >的 getWriterObjectManager () - >冲洗();
没什么'发生的。没有好处。
似乎 readerObjectManager 和 writerObjectManager 拥有独立的“实体池”,所以我不能坚持并从另一个管理器中更改一个实体。
有没有办法将实体从一个管理器传递到另一个管理器,或引用它,或者两个管理器共享同一个“实体池”的简单方法?
提前感谢。
答案 0 :(得分:1)
您不能在多个实体管理器中拥有托管实体:不受支持且可能导致意外行为。
如果确实需要将读取与写入分开,请使用主/从连接或通过实现自己的Doctrine\DBAL\Connection
对象在连接级别执行此操作。
此外,读取通常不是通过ObjectManager
处理,而是通过ObjectRepository
处理(您可以在其中实现自定义内存中策略以优化读取操作)。
另一种处理方法是将实体从" read" ObjectManager
并将它们合并回"写" ObjectManager
。
同样,我们不建议这样做,您应该在连接级别或更智能的存储库实现处理它,以满足您的需求。