私は Data Mapper パターンを使用していますが、そのパターンとの関係を処理する最善の方法は何かを考えています。Google とスタック オーバーフローで解決策を探すのに多くの時間を費やしました。
私はPHPで作業しているので、私が入れるコードの例はPHPです。
テーブル「チーム」(ID、名前)とテーブル「プレーヤー」(ID、名前、チームID)があるとしましょう。これは 1 対 N の関係です。Data Mapper パターンを実装すると、Team、TeamMapper、Player、PlayerMapper というクラスが作成されます。
これまでのところ、すべてが単純です。チームからすべてのプレイヤーを取得したい場合はどうすればよいでしょうか?
私が見つけた最初の解決策は、遅延読み込みとプロキシでそれを処理するメソッド getAllPlayers() を Team クラスに作成することです。次に、そのようなチームのプレーヤーを取得できます。
$players = $team->getAllPlayers();
私が見つけた 2 番目の解決策は、PlayerMapper を直接使用し、チーム ID をパラメーターとして渡すことです。何かのようなもの:
$playerMapper->findAll(array('team_id' => $team->getId()));
しかしここで、すべてのチームと、各チームのすべてのプレーヤーを含む「プレーヤー」列を含む HTML テーブルを表示したいとしましょう。最初に説明したソリューションを使用する場合、チームのリストを取得するために 1 つの SQL クエリを実行し、プレーヤーを取得するためにチームごとに 1 つのクエリを実行する必要があります。これは、N がチームの数である場合、N+1 の SQL クエリを意味します。
説明した 2 番目のソリューションを使用すると、最初にすべてのチーム ID を取得し、それらを配列に入れ、それをプレーヤー マッパーの findAll メソッドに渡すことができます。
$playerMapper->findAll(array('team_id' => $teamIds));
その場合、実行する必要があるクエリは 2 つだけです。ずっといい。しかし、関係はモデルに記述されておらず、それらについて知る必要があるのは開発者であるため、私はその解決策にまだあまり満足していません。
だから私の質問は: Data Mapper パターンの他の選択肢はありますか? 私が示した例では、モデルへの関係の説明を使用して、わずか 2 つのクエリですべてのプレーヤーを持つすべてのチームを選択する良い方法はありますか?
前もって感謝します!