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

我们假设为Zend Framework应用程序设置了以下表格。

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

我将Data Mapper方法应用于基本上给予我的模型:

  • Model_UserModel_UsersMapperModel_DbTable_Users
  • Model_GroupModel_GroupsMapperModel_DbTable_Groups
  • Model_GroupUserModel_GroupsUsersMapperModel_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_UsersMapperModel_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)。

    我会尽量避免让域对象知道数据层,因为这是使用这种模式的关键点。 数据层应该是一个愚蠢的工厂,可以实例化你的域对象。

    只是我的承担:)

    链接地址: http://www.djcxy.com/p/9611.html

    上一篇: Taking the data mapper approach in Zend Framework

    下一篇: Data Mapper and Relationships: Implementation strategies?