10

私は 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 つのクエリですべてのプレーヤーを持つすべてのチームを選択する良い方法はありますか?

前もって感謝します!

4

2 に答える 2

2

DataMapper がどのように機能するかを説明している Martin Fowler のテキストを見ると、1 つのクエリを使用して必要なすべてのデータを取得し、そのデータを各マッパーに渡して、マッパーがデータのみを選択できることがわかります。それが必要であること。

あなたにとって、これはチームからプレーヤーに結合するクエリであり、一意のプレーヤーごとに複製されたチーム データを含む結果セットを返します。

次に、データが変更されたときにのみ新しいオブジェクトを作成することで、マッピング コードの重複に対応する必要があります。

チーム マッパーが結果セットを反復処理し、一意のチームごとに結果セットをプレイヤー マッパーに渡して、プレイヤーを作成し、そのプレイヤーをチームのコレクションに追加できるようにする、似たようなことを行いました。

これは機能しますが、このアプローチのさらに下流には問題があります...

于 2012-12-05T16:43:28.003 に答える