让我们假设下表为 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 仅反射(reflect)组表中的字段。如何返回用户所属组的集合以及用户加入每个组的组的日期?如果我只是将属性添加到域对象,那么我必须让组映射器知道它,不是吗?
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 方法,该方法在需要时通过调用数据映射器中的适当方法延迟加载组,这就引出了第二个问题。我应该让域对象知道数据映射器吗?
最佳答案
这可能是一个非常令人困惑的问题,因为关系数据库很难映射到对象模型。
我倾向于首先关注您的对象模型要求。例如,如果在您的对象模型中,您的用户对象(几乎)总是知道组是有意义的,那么这种关系应该合并到用户类中。另一方面,如果您经常需要使用用户而不需要知道他们属于哪个组,那么您可以有两个用户类,一个基类和一个组感知扩展版本(base_user 和 group_user)。
我会尽量避免让域对象知道数据层,因为这是使用此模式的全部要点。数据层应该只是一个实例化域对象的哑工厂。
只是我的看法:)
关于php - 在 Zend Framework 中采用数据映射器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2502334/