1

仕様:CodeigniterFramework上に構築されたmySQLを備えたPHP5。

私はと呼ばれるデータベーステーブルを持っていて、それからとgameのような特定のテーブルをスポーツします。これらのスポーツ固有のテーブルには、テーブルにリンクするフィールドがあります。対応するクラスと/があり、どちらも。を拡張します。soccerGamefootballGamegameIdgamegamesoccerGamefootballGamegame

ユーザーに表示するゲーム情報を検索すると、2つのテーブルを動的にリンクする方法がわかりません。1回のクエリですべての情報を取得できるかどうか知りたいです。game問題は、スポーツ名を把握するために、最初にテーブルを照会する必要があることです。

それが不可能な場合、私の次の考えは2つのクエリでそれを行うことです。ゲームテーブルにgame_modelクエリを実行し、スポーツ名に基づいて、適切なスポーツ固有のモデル(つまりsoccer_game_model)を呼び出し、スポーツ固有の情報を取得します。

gameまた、オブジェクトをに渡し、soccer_modelそのsoccer_modelオブジェクトを使用してオブジェクトを作成しsoccerGameます。親オブジェクトを作成し、それを拡張クラスに渡してまったく新しいオブジェクトを作成しているので、これは少しばかげているように見えますか?

考え?

助けてくれてありがとう。

編集:

ゲームテーブル

gameId
sport (soccer, basketball, football, etc)
date
other data

サッカーゲームテーブル

soccerGameId
gameId
soccer specific information

フットボールゲームテーブル

footballGameId
gameId
football specific information

他のスポーツなど

したがって、情報を取得する必要があるスポーツ固有のテーブルを決定する前に、スポーツが何であるかを知る必要があります。

アップデート:

ご入力いただきありがとうございます。動的SQLはストアドプロシージャを介してのみ可能であるように思われますが、これは私が今はよく理解していないことです。そして、それらを使っても、それはまだ少し厄介です。今、私は2つのクエリルートに行きます。1つはスポーツ名を取得し、次にスイッチを使用して適切なモデルを取得します。

gamePHP側から見ると、オブジェクトを取得して、たとえばmyに渡してから、元のの子であるオブジェクトsoccer_game_modelを返してもらうのは少しばかげているようです。それはどのように行われなければならないのですか?または、ここでOOの観点から何かが欠けていますか?soccer_gamegame

4

3 に答える 3

1

アップデート

ゲームデータを検索するときは、「sport」パラメータを渡すことを検討してください。隠されたフィールドとして、おそらく。次に、モデルでswitchステートメントを使用できます。

switch($gameValue) {
  case 'football': $gameTable = "footballGame"; break;
  case 'soccer': $gameTable = "soccerGame"; break;
}

次に、これに基づいてクエリを実行します。

"SELECT * 
FROM ". $gameTable . "
...etc

テーブルを結合と組み合わせることができます。http://www.w3schools.com/sql/sql_join.asp

たとえば、15のfootballGameIdからすべてのデータを取得する必要があるgame場合footballGame

SELECT *
FROM footballGame a
LEFT OUTER JOIN game b ON a.id = b.gameId
WHERE footballGameId = 15
于 2013-03-13T18:08:02.387 に答える
1

Devin Youngの答えを拡張するには、次のようにCodeigniterのアクティブレコードクラスを使用してこれを実現します。

public function get_game_by_id($game_id, $table)
{
    return $this->db->join('game', 'game.id = ' . $table .  '.gameId', 'left')
    ->where($table . '.gameId', $game_id)
    ->get('game')
    ->result();
}

したがって、共有されているgameIdによってテーブルを結合し、where句を使用して正しいものを見つけます。最後に、result()を使用してオブジェクトの配列を返します。

編集:私はあなたがsoccerGame、footballGameテーブルなどのいずれかに参加できるテーブルの名前を渡すことができるように2番目のテーブルパラメータを追加しました。

プログラムのこの時点でどのスポーツを選択すればよいかわからない場合は、一歩下がって、それを追加する方法を確認してください。今後問題が発生するため、すべてのスポーツテーブルに複数の結合を追加するのは気が進まないでしょう。

于 2013-03-13T18:24:15.947 に答える
1

標準のクエリを介してそれを行う方法のオプションについては、このスタックオーバーフローの回答を確認してください。次に、必要に応じてそれをアクティブレコードに変換できます(ただし、アプリでDBに依存しない呼び出しが必要ない場合は、複雑で時間の価値がない可能性があります)。

価値があるので、複数のクエリを実行しても問題はありません。他のクエリよりも遅い可能性があります。いくつかのオプションを試して、あなたとあなたのアプリに最適なものを確認してください。

于 2013-03-13T18:29:47.703 に答える