4

ユーザーが目的地への旅行を作成し、これらの旅行に他のユーザーを招待できる PHP Web アプリケーションに取り組んでいます。

DestinationsTrips、およびのMySql テーブルと、 との間の多対多の関係を解決するためにUsers呼び出されるテーブルがあります。InvitesUsersTrips

これらのテーブルごとに、アプリケーション内にクラスを作成しました (Destinationsクラスもクラスも同様Tripsです)。オブジェクトをインスタンス化し、MySQL クエリからプロパティを割り当てることができるように、これらのクラスごとに静的関数を作成しました (したがって、クエリから返される各行はSELECT *、オブジェクトがインスタンス化され、プロパティが割り当てられます)。

ユーザーが計画したすべての旅行の詳細を表示できるページを作成しようとしています。このページには、目的地 ( からDestinations)、旅行の詳細 ( からの日付などTrips)、および招待したユーザーの詳細 ( からのユーザー名などUsers) が表示され、このすべてのデータが各旅行が行である html テーブルに配置されます。

Tripsこれを達成するために、これまでのところ、どれがユーザーのuser_idに関連しDestinationsInvitesどれがそれらTripsに関連し、Usersどれがそれらに関連しているかをインスタンス化してきましたInvites。次に、ネストされた foreach ループを使用して、以下のように必要に応じてこれらを表示しました。

foreach($trips as $trip) {
 foreach($invites as $invite) {
   foreach($invited_users as $invited_user) {
      if($invite->trip_id == $trip->id && $invite->guest_id == $invited_user->id) {
        echo $invited_user->name;
                  } } } }

私が見ることができるのは恐ろしいことであり、これを行う方法はありません。

読んでみると、MySQL を使用して 4 つのテーブルを結合し、関連する旅行に関連するデータのみを選択したいと思います。よくわからないのは次のとおりです。

a) オブジェクトをインスタンス化し、この MySQL の結果からそれらのプロパティを正しく割り当てるにはどうすればよいですか?

foreachb) それが完了したとしても、正しいトリップと一緒に正しいデータを表示するためのコストのかかるループを回避するにはどうすればよいですか?

オブジェクト指向の方法で複数の関連データベース テーブルからのデータを表示する「ベスト プラクティス」の方法はありますか?

4

2 に答える 2

2

まず、「グッドプラクティス」は、偏見に尊敬の念を与えるために人々が使用するフレーズの1つです。デザインで特定の目標を達成する方法を尋ねたほうがよいでしょう。

そうは言っても、RDBMSをオブジェクト指向システムにマッピングする際によくある問題に遭遇しました。たくさんの議論のためのグーグル「遅延読み込み」。問題は、一度にいくつの「関係」をロードするかという問題に帰着します。あなたの例では、旅行は目的地とユーザーにリンクされています。「旅行」をロードするときに、目的地とユーザーもロードする必要がありますか?その場合、ユーザーの他の情報もロードする必要があります(たとえば、他の旅行に参加していますか?)。その場合、ユーザーが行っているすべての旅行の旅行データを読み込みますか?など-注意しないと、データベース全体をロードすることになります。

関連するすべてのエンティティをロードしないことの欠点は、各オブジェクトのデータを一度にロードすると、パフォーマンスが非常に低下する可能性があることです。

ベストプラクティスであると私が信じていることの詳細な説明については、Evansによる「ドメイン駆動設計」を購入して読んでください。

ショートカットとして、データベースレコードをオブジェクトにマップする方法を知っている「リポジトリ」レイヤーを作成し、必要なものを検索するためのカスタムメソッドを作成することを検討してください。たとえば、次を呼び出すことができます。

$repository::getTripsForUser($userID);

このメソッドは、4つのテーブルを結合するSQLクエリを実行し、結果をオブジェクトツリーに変換します。

この問題を解決するために他の人が行った作業を利用することをお勧めします。この問題を解決する「オブジェクトリレーショナルマッピング」フレームワークがいくつかあります。ORMソリューションが生活を楽にするかどうかについてはまだ陪審員がいないと思いますが、一見の価値があります。

于 2012-11-11T21:25:28.703 に答える
0

すべてのデータを一度にロードする必要はありません。

1 人のユーザーの旅行を表示する必要があるのに、なぜすべての旅行を繰り返す必要があるのでしょうか。

OOP を使用した素朴だが単純なアプローチ:Userユーザーの関連する旅行を取得するメソッドを持つクラス。

Tripそれ自体が招待されたユーザーの参照を持つの配列を返すことができます:

class User {
    private $id;
    public function __construct($id) {
        $this->id = $id;
    }
    public function getTrips() {
        $trips = array();
        // Run your query using $this->id to build the WHERE clause
        return $trips;
    }
}

class Trip {

    // Array of User objects invited to the trip        
    private $invited = array();

    // Other methods here to add/retrieve invited users

}

$user = new User(1);
foreach ($user->getTrips() as $trip) {
    // Do something with $trip
}

理想的には、Userインスタンスはセッションに保存されます

于 2012-11-11T20:57:24.790 に答える