Zend Framework アプリ用に次のテーブルが設定されているとします。
user (id)
groups (id)
groups_users (id, user_id, group_id, join_date)
私は基本的に私に与えるモデルにデータマッパーのアプローチを取りました:
- 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はグループ テーブルのフィールドのみをミラーリングします。ユーザーがメンバーであるグループのコレクションと、ユーザーがグループごとにそのグループに参加した日付を返すにはどうすればよいですか? プロパティをドメイン オブジェクトに追加しただけなら、グループ マッパーにそのことを知らせる必要がありますね。
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 番目の質問が必要です。ドメイン オブジェクトがデータ マッパーを認識できるようにする必要がありますか?