【问题标题】:ZF2 doctrine shared entity poolZF2 学说共享实体池
【发布时间】:2013-02-04 11:51:06
【问题描述】:

我在我的 ZF2 项目中使用 Doctrine 设置了一个多数据库连接,一个用于读取数据库,另一个用于写入。

单独使用时一切正常,但当我尝试在同一个实体上使用两者时,例如:

寻找用户:

$user = $this->getReaderObjectManager()->getRepository('Entity\User')->findOneBy(array('username' =>'xpto'));

然后尝试改变一些东西:

$this->getWriterObjectManager()->persist($user); $user->setBlabla('bla');

然后尝试刷新它:

$this->getWriterObjectManager()->flush();

什么都没发生。不好。

似乎 readerObjectManagerwriterObjectManager 有它们独立的“实体池”,所以我不能持久化并从另一个管理器更改一个实体。

有没有办法将实体从一个管理器传递给另一个管理器,或者引用它,或者两个管理器共享同一个“实体池”?

提前致谢。

【问题讨论】:

    标签: doctrine-orm zend-framework2


    【解决方案1】:

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

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

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

    另一种处理方法是将实体从“读取”ObjectManager 中分离出来,并将它们合并回“写入”ObjectManager

    同样,不建议这样做,您应该在连接级别处理它,或者使用适合您需求的更智能的存储库实现来处理它。

    【讨论】:

    • 你能解释一下“在连接级别”是什么意思吗?
    • 这意味着连接对象决定读取和写入处理的内容(这通常发生在主/从环境中)。如果您的问题仅与 PHP 内存有关,请仅使用非常智能的存储库。
    • 唯一的问题是必须从一个数据库读取并在另一个数据库中写入(生产环境设置)。那么,创建一个自定义 DBALConnection 是否可行?或者有没有一种方法可以绕过标准 orm_default 连接,在插入/更新和选择操作中“即时”更改连接信息?
    • 您可以覆盖服务doctrine.connection.orm_default并使用教义的内置MasterSlave连接:github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/…
    • 将检查并尝试!谢谢:)
    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多