让我们假设 Zend Framework 应用程序设置了以下表格。
user (id)
groups (id)
groups_users (id, user_id, group_id, join_date)
我对模型采用了 Data Mapper 方法,它基本上给了我:
- Model_User , Model_UsersMapper , Model_DbTable_Users
- Model_Group , Model_GroupsMapper , Model_DbTable_Groups
- Model_GroupUser , Model_GroupsUsersMapper , Model_DbTable_GroupsUsers(用于保存可以视为实体的关系;注意“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还是Model_GroupsUsersMapper?
我还想利用引用映射(从属表)机制,并可能使用 findManyToManyRowset 或 findDependentRowset,例如:
$result = $this->getDbTable()->find($userId);
$row = $result->current();
$groups = $row->findManyToManyRowset(
'Model_DbTable_Groups',
'Model_DbTable_GroupsUsers'
);
当我可以在一个查询中编写它时,这将产生两个查询。我将把它放在 Model_GroupsUsersMapper 类中。
增强功能是向 Model_User 域对象添加一个 getGroups 方法,该方法在需要时通过调用数据映射器中的适当方法来延迟加载组,这需要第二个问题。我应该让域对象知道数据映射器吗?