2016-02-29 123 views
0

過去曾問過這個問題的迭代過程,但這提出了獨特的挑戰,因爲它將一些較大問題中的一些問題組合在一起。使用主鍵與外鍵共享的一對一關係中的用戶對象

我有一個實體(用戶),用作我的應用程序中的用戶類,然後我有另一個實體(UserExtra),與用戶實體一對一的關係,UserExtra的id與用戶。外鍵與主鍵相同。

當用戶對象被加載時(比如通過$this->getUser(){{ app.user }},UserExtra數據也通過連接加載。具有兩個實體的整個點是,所以我不必一次加載所有數據。

我甚至試着爲用戶定義一個自定義UserLoaderInterface/UserProviderInterface存儲庫,確保refreshUser和loadUserByUsername只會加載用戶數據(我想讓UserExtra數據坐在代理中,除非我明確需要它),但當Doctrine去保存對象時,它會發出額外的查詢來加載UserExtra數據,從而跳過代理狀態。

Is有沒有辦法呢?

+0

到目前爲止,我設法使它由錯誤標記的關係工作作爲多對一(額外的許多)並修改getExtra和setExtra,以便它們可以訪問 - > extra [0]。 這當然不好。 –

回答

0

有您的問題很多解決方案:

1)將擁有方和反側http://developer.happyr.com/choose-owning-side-in-onetoone-relation - 我不認爲從數據庫設計的角度來看,每次這是正確的。

2)在find,findAll等函數中,OneToOne中的反面會自動連接(它總是像EAGER一樣)。但在DQL中,它不像獲取EAGER那樣工作,並且花費額外的查詢。可能的解決方案是每次加入逆實體

3)如果替代結果格式(即getArrayResult())足以滿足某些使用情況,那麼也可以避免此問題。

4)改變反面是OneToMany - 只是看起來錯了,也許可能是一個臨時的解決方法。

5)強制部分對象。沒有額外的查詢,但也沒有延遲加載:$query->setHint (Query::HINT_FORCE_PARTIAL_LOAD, true) - 接縫給我唯一可能的解決方案,但不是沒有價格: 部分對象有點冒險,因爲你的實體行爲不正常。例如,如果您沒有在->select()中指定您將用戶的所有關聯,則可能因爲對象未滿而出現錯誤,則所有未具體選擇的關聯都將爲空

6)未映射反向雙向OneToOne關聯而無論是使用一個明確的服務或更多的活動記錄的方法 - https://github.com/doctrine/doctrine2/pull/970#issuecomment-38383961 - 它看起來像學說關閉了該問題

這個問題可以幫助你:one to one relation load

+0

方法4似乎是唯一適合解決方案的人(正如我在之前的評論中提到的那樣)。 主義用戶多次提出這個問題。建議延遲加載非實體屬性(如加載用戶對象,但爲「preferredCookieType」屬性使用代理字段,並在實際訪問該值時發出另一個查詢)。 但我認爲這仍然是一個懸而未決的問題。 –

相關問題