我們假設爲Zend Framework應用程序設置了以下表格。在Zend Framework中採用數據映射器方法
user (id)
groups (id)
groups_users (id, user_id, group_id, join_date)
我把數據映射方法模型基本上給了我:
- Model_User,Model_UsersMapper,Model_DbTable_Users
- Model_Group,Model_GroupsMapper,Model_DbTable_Groups
- Model_GroupUser,Model_GroupsUsersMapper,Model_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域對象,該對象在需要時通過調用數據映射器中的適當方法來延遲加載組,這會引發第二個問題。我應該允許域對象瞭解數據映射器嗎?
但如何獲取組的列表(只是集團的對象數組到目前爲止)和用戶數每個組呢?我應該返回一個數組數組,每個小數組有兩個屬性 - 組對象和用戶數? – 2010-03-25 08:38:17