2013-02-19 73 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