2011-06-24 51 views
9

我正在使用PHP中的DAO模式。我理解你以這種方式分離你的模型所帶來的好處,但我不明白的是,當你的表通過關聯實體關聯時,你應該如何構建DAO和VO。dao模式和關係

我舉一個例子:

在我的數據庫我有

USERS(id,username); 

USERS_POSTS(id_user(FK),id_post(FK)); 

POSTS(id, title); 

USER_COMMENTS(id_user(Fk),id_post(FK)); 

COMMENTS(id, text); 

創建UserVOPostVO與相應的getter和setter方法,然後的UserDAO帖子DAO負責最終返回VO的SQL。 對來自這些表格的數據執行CRUD操作非常簡單,但是當您開始考慮關聯表格並檢索跨不同表格的數據時,您開始認爲使用DAO不再那麼簡單了...

How如果你想返回文章作者的所有評論,你會組織你的DAO模式嗎?我不需要SQL查詢我只是把這作爲一個真實情況的例子...

我讀過,對於每個關聯表都有一個關聯的DAO和Vo是一個好主意。 它的VO包含什麼?只有2個外鍵或來自兩個表的所有屬性?

如果邏輯對於關聯實體具有DAO和VO如果查詢通過多於3個表(使用2個關聯實體),那麼解決方案是什麼?

我懷疑DAO模式將有對象調用users_posts_comments_article :)))

感謝

+0

太好了,我有三個upvotes:P現在,任何人都可以告訴我們更多關於這個問題:)我知道有ORM搶救,但我沒有得到DAO :))) – luigi7up

+0

的Poing的,我差點忘了......我有一種感覺,如果我開始實施的事情,與我的關係就結束了重塑處理輪子 - 即ORM?! – luigi7up

回答

1

至於自己,你想和編寫提供了一層什麼樣的數據。不要考慮如何調用加入兩個以上表的類。 您正在考慮將您的表格變爲模型,您可能會朝着不適合您項目的方向前進。由於我不知道你的項目有多大,我不能說這是否可以。

這裏有一個讀那絕對會給你想到一些食物:http://weierophinney.net/matthew/archives/202-Model-Infrastructure.html那篇文章(他指的領域模型)

報價:

當你覺得在這些方面,你 啓動將您的系統拆分爲 您需要的零散件,以及 每件與其他零件的關係。這個 類型的練習還可以幫助您根據 數據庫表來停止考慮您的模型的 ;相反,您的 數據庫將成爲 中的容器,該數據將從您的模型的一個使用 持續保存到下一個。您的模型 反而是一個對象,它可以自動執行 數據傳入或存儲 數據 - 甚至完全可以使用 。

+0

朱利安,謝謝你的回答,但你能更具體一點在你的答案?你說「並編寫一個提供該層的圖層」。你到底會得到什麼? – luigi7up

+2

你可能有這樣的事情:'類BlogService',並在那裏有'getCommentsForUser($用戶id)','getUsersWhoNeverValidatedTheirEmailAddress($選項)'等等,等等。這樣,你看到一個更通用的方法你的博客,而不是受限於你的數據庫表類可以做什麼。 – Julian

+0

額外的服務層是個好主意。讓數據層做基本的東西,服務可以將它們組合起來形成更復雜的過程。 –

0

保持簡單,S。 DAO或任何哲學或任何東西只能有道理一定的限制。恕我直言,如果你想要抽象,只需要簡單的getitem('class',$ conditions)或者獲取相關的($ pathandconditions,$ itemconditions),這對於博客這樣簡單的事情來說是浪費時間。

那種東西肯定涵蓋了所有你可以有基本的SQL的使用需求。

的getUsersWhoHaveAFrigginLongMethodNameofDoom實在是一個糟糕的主意,這樣的定義過於unabstracted複製/粘貼功能,直接違背了可維護性等