簡體   English   中英

在Zend Framework中采用數據映射器方法

[英]Taking the data mapper approach in 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_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)。

我會盡量避免讓域對象知道數據層,因為這是使用此模式的全部要點。 數據層幾乎應該只是一個實例化域對象的啞工廠。

只是我的看法:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM