4

我們假設爲Zend Framework應用程序設置了以下表格。在Zend Framework中採用數據映射器方法

user (id) 
groups (id) 
groups_users (id, user_id, group_id, join_date) 

我把數據映射方法模型基本上給了我:

  • Model_UserModel_UsersMapperModel_DbTable_Users
  • Model_GroupModel_GroupsMapperModel_DbTable_Groups
  • Model_GroupUserModel_GroupsUsersMapperModel_DbTable_GroupsUsers(用於保持可以被看作是aentities的關係;注意到 「join_date」 屬性)

我定義在Model_DbTable_GroupsUsers的_referenceMap:

protected $_referenceMap = array (
    'User' => array (
     'columns'  => array('user_id'), 
     'refTableClass' => 'Model_DbTable_Users', 
     'refColumns' => array('id') 
    ), 
    'App' => array (
     'columns'  => array('group_id'), 
     'refTableClass' => 'Model_DbTable_Groups', 
     'refColumns' => array('id') 
    ) 
); 

我有考慮到這些設計問題:

1)Model_Group只鏡像組表中的字段。如何返回用戶所屬的組的集合,以及用戶加入該組的每個組的日期?如果我只是將屬性添加到域對象,那麼我不得不讓組映射器知道它,對嗎? 2)假設我需要獲取用戶所屬的組。我應該把這個邏輯放在哪裏? Model_UsersMapper or Model_GroupsUsersMapper

我也想利用參考地圖(從屬表)機制,並可能使用findManyToManyRowset或findDependentRowset,是這樣的:

$result = $this->getDbTable()->find($userId); 
$row = $result->current(); 

$groups = $row->findManyToManyRowset(
    'Model_DbTable_Groups', 
    'Model_DbTable_GroupsUsers' 
); 

這將產生兩個查詢時,我可以只寫它的單個查詢。我將把它放在Model_GroupsUsersMapper類中。

增強功能是將一個getGroups方法添加到Model_User域對象,該對象在需要時通過調用數據映射器中的適當方法來延遲加載組,這會引發第二個問題。我應該允許域對象瞭解數據映射器嗎?

回答

2

這可能是一個相當混亂的問題,因爲關係數據庫可能很難映射到對象模型。

我傾向於首先關注你的對象模型需求。例如,如果在你的對象模型中,你的用戶對象(幾乎)總是知道這些組是合理的,那麼這個關係應該被合併到用戶類中。另一方面,如果您經常需要使用用戶而不需要知道它們是哪一個組,則可能有兩個用戶類,一個基類和一個組感知的擴展版本(base_user和group_user)。

我會盡量避免讓域對象知道數據層,因爲這是使用這種模式的全部要點。數據層應該是一個愚蠢的工廠,可以實例化你的域對象。

只是我對其採取:)

+0

但如何獲取組的列表(只是集團的對象數組到目前爲止)和用戶數每個組呢?我應該返回一個數組數組,每個小數組有兩個屬性 - 組對象和用戶數? – 2010-03-25 08:38:17