4

Zend Framework アプリ用に次のテーブルが設定されているとします。

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

私は基本的に私に与えるモデルにデータマッパーのアプローチを取りました:

  • 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'
);

これは、1 つのクエリで記述できたはずのクエリが 2 つ生成されます。これを Model_GroupsUsersMapper クラスに配置します。

機能拡張は、Model_User ドメイン オブジェクトに getGroups メソッドを追加することです。このメソッドは、必要に応じて、データ マッパーで適切なメソッドを呼び出してグループを遅延ロードします。これには 2 番目の質問が必要です。ドメイン オブジェクトがデータ マッパーを認識できるようにする必要がありますか?

4

1 に答える 1