2011-10-24 22 views
14

我是symfony2和學說的新手。 這裏是問題看到它。 我不能使用:讀對象持續存在,但尚未與教條沖刷

,其依然存在,但尚未FLUSHED在物體上
$repository = $this->getDoctrine()->getRepository('entity'); 
$my_object = $repository->findOneBy($index); 

!! 我認爲getRepository是從數據庫中讀取的,所以它不會找到一個沒有刷新的對象。

我的問題:如何讀取持久保存的對象(我認爲他們是在「學說會話」的地方),以我做我的沖洗整批前重新使用它們?

每一個配置有256個物理羽毛。

每個配置都分配了1個plumeOptions記錄。

plumeOptions,我有一個cartridgeplume這是一個FK爲PhysicalPlume

每羽都由ID(自動生成)和INDEX(用戶生成)標識。

規則:我說型材1具有連接到它physical_plume_index號3(下標)。

現在,我想一個配置文件,它的所有相關數據到另一個配置文件複製。

創建新配置文件。新的256羽是從舊的配置文件創建和複製的。

我想新的配置文件鏈接到新羽指數3

檢查這裏:http://pastebin.com/WFa8vkt1

回答

9

我想你可能想看看這個功能:

$entityManager->getUnitOfWork()->getScheduledEntityInsertions() 

給你一個持久化的實體對象列表。

嗯,我沒有真正讀你的問題,上面你會檢索一個完整列表(作爲一個數組),但你不能像getRepository那樣查詢它。我會盡量找到東西ü..

+0

thx爲您的答覆。 檢查我的[編輯]部分.. – xeon

+0

我可以在我的動作中執行雙刷新()嗎? 我從來沒有嘗試過,但只是一個問題..也許是一個愚蠢的?!? 我沖洗新創建的羽毛,然後我繼續獲取其他羽毛選項,我現在可以將它們鏈接到新創建的羽毛。 你怎麼找到這個想法...? (希望不要這麼愚蠢!!) – xeon

+0

據我所知你可以調用flush()多次你想要的。 Offcourse最佳做法是儘可能減少連接流量。但是如果你需要你之前添加的實體的ID,那麼這是一個好習慣。 –

3

我想你可能看問題,從錯誤的角度。學說是你的持久層和數據庫訪問層。一旦它們在內存中,對象提供對對象的訪問權限是你的域模型的責任。所以問題歸結爲how do you get a reference to an object without the persistance layer

你在哪裏創建你需要稍後獲取的對象?創建該對象的方法/服務是否可以返回對控制器的引用,以便將其傳播到您需要的其他位置?你能派遣一個你在應用程序的其他地方收聽的事件來獲取對象嗎?

在我看來,Doctrine應該用於應用程序的啓動(儘可能早),初始化域模型,並在應用程序關閉時,在請求期間保持對域模型的任何更改。在我看來,使用存儲庫來獲取請求中間的對象可能是一種代碼異味,您應該看看如何重構應用程序流以消除該需求。

+0

我不知道我同意這不是提供訪問的教義的工作。至少在Zend中,Doctrine被用作**實體管理器**,對我來說聽起來就像應該包含對象引用的地方。在代碼確定它想要堅持和實體化之後,持久層Doctrine應該是唯一一個(通常)需要關心實體是否寫入數據庫的實體。雖然也許在Zend中EntityManager可以提供一些其他方法來訪問除Doctrine存儲庫之外的其他實體,但是如果是這樣,我不知道這是什麼方式。 –

+0

我不認爲你明白這個問題:/ – xDaizu

0

你的業務邏輯問題是有效的。

查詢數據庫通過對象上的查詢還沒有刷新,意味着更多地查找已經在函數範圍內的數據庫層查詢對象。

另請注意,findOneBy將檢索先前使用相同功能保存的其他對象。

如果您只需要在這些新創建的對象中查找,您應該使f.e.他們在一個會話數組變量中,並用foreach進行迭代。

如果您需要混合使用已保存的項目和一些新項目,您應該分別威脅2個部分,一個使用foreach,另一個使用存儲庫查詢!