我正在使用数据映射器模式,并且想知道在该模式下处理关系的最佳方法。我花了很多时间在谷歌和Stack Overflow上搜索解决方案,我找到了一些,但我对它们仍不完全满意,特别是在一个我将尝试解释的特殊情况下。
我正在使用PHP,所以我将放置 PHP 代码示例。
假设有一个表"team"(id, name)和一个表"player"(id, name, team_id),它们之间存在1-N关系。通过实现数据映射器模式,我们可以拥有以下类: Team、TeamMapper、Player 和 PlayerMapper。
到目前为止,一切都很简单。如果我们想从一个团队获取所有球员怎么办?
我找到的第一个解决方案是在 Team 类中创建一个 getAllPlayers() 方法,使用延迟加载和代理来处理这个问题。然后,我们可以像这样检索一个团队的球员:
$players = $team->getAllPlayers();
我发现的第二种解决方案是直接使用PlayerMapper并将团队ID作为参数传递。像这样:
$playerMapper->findAll(array('team_id' => $team->getId()));
现在,假设我想展示一个带有'Players'列的HTML表格,其中包含所有团队的球员。如果我们使用我描述的第一种解决方案,我们将不得不执行一次SQL查询来获取团队列表,并且对于每个团队还需要执行一次查询以获取球员,这意味着需要进行N+1次SQL查询,其中N是团队数。
如果我们使用我描述的第二种解决方案,我们可以先检索所有团队ID,将它们放入数组中,然后将其传递给player mapper的findAll方法,类似于这样:
$playerMapper->findAll(array('team_id' => $teamIds));
在这种情况下,我们只需要运行2个查询。好多了。但我仍然对这个解决方案不太满意,因为关系没有描述到模型中,而且是开发人员必须了解它们。
所以我的问题是:数据映射器模式是否有其他选择?在我给出的示例中,是否有一种良好的方式来选择所有具有模型中关系描述的所有球队和球员,只需使用2个查询?
提前谢谢!