php – 在Zend Framework中采用数据映射器方法

我们假设为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仅镜像groups表中的字段.如何返回用户所属的组的集合以及用户为每个组加入该组的日期?如果我只是将属性添加到域对象,那么我必须让组映射器了解它,不是吗?

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类中.

增强功能是将一个getGroups方法添加到Model_User域对象中,该对象在需要时通过调用数据映射器中的相应方法来懒惰地加载组,这对于第二个问题是必要的.我应该允许域对象了解数据映射器吗?

最佳答案 这可能是相当混乱的问题,因为关系数据库很难映射到对象模型.

我倾向于首先关注你的对象模型要求.例如,如果在您的对象模型中,您的用户对象(几乎)始终知道这些组是有意义的,那么这种关系应该合并到用户类中.另一方面,如果您经常需要使用用户而不需要知道他们所属的组,也许您可​​以拥有两个用户类,一个基类和一个组感知扩展版本(base_user和group_user).

我会尽量避免让域对象知道数据层,因为这是使用这种模式的重点.数据层应该只是一个实例化域对象的哑工厂.

只是我对它的看法:)

点赞