2010-01-31 28 views
0

即時嘗試執行Data Gateway/Domain Pattern。我理解基本知識以及將領域邏輯與持久數據層分離的奇妙模式。現在我有以下要求:來自2個域模型的組合數據

可以說我有2個域模型:用戶和公司。當我想檢索與所有用戶一個用戶列表,我會做這樣的事情:

$userGateway = new Model_UserGateway(); 

$users = $userGateway->fetchAll(); 

foreach ($users as $user) {...} 

,工作得非常不錯,但現在棘手的問題:我現在想與所有用戶及其相應的公司名單。我可以遍歷每個用戶和相關公司的用戶和實例,但是...並不是我最喜歡的解決方案。在最糟糕的情況下,我產生嵌套的數據庫查詢。另一種方法是,我獲取更多的用戶數據與網關和對付他們...我不知道:(

最新最好的實踐來獲得與公司信息,用戶列表?

感謝推進

邁克爾中號

回答

0

Model_UserGateway實現像fetchAllWithCompany的方法。在這種方法中,你執行取兩個表的信息的數據庫查詢。如

SELECT * 
FROM user 
LEFT JOIN company ON user.id = company.user_id 

,然後你得到所有你想要的信息:

$users = $userGateway->fetachAllWithCompany(); 

這是我會做的方式。正如你所說,爲每個用戶創建一個查詢來獲得它的公司並不好。

編輯:

假設你User對象有一個getCompany方法,你可以這樣做:

foreach($users as $user) { 
    $company = $user->getCompany() 
} 

當然getCompany應該返回一個Company對象。

你想實現這個學習?由於許多框架支持這種類型的數據庫抽象,例如Zend framework

+0

謝謝你的回答! userGateway返回一組用戶對象,什麼會返回fetchAllWithCompany方法? – michaelm 2010-01-31 11:18:20

+0

@michaelm:也是一組用戶對象。用戶對象應該有一個方法'getCompany'。 – 2010-01-31 11:21:53

+0

我假設一個「價值」 - 對象必須與所有數據完全實例化?所以我必須在用戶網關中獲取所有公司數據才能在用戶模型中正確實例化公司模型,對吧? (如果沒有,我可以想象,有一個懶加載模型模式:-)) – michaelm 2010-01-31 11:38:24