1

これをどのように構成するかを理解するのに苦労しています。これが私のアプリです:

それはゲームのウェブサイトです...ゲームは「単語検索」、「数独」、「クロスワードパズル」です。

各ゲームには多くのパズルがあります。つまり、100 ほどの単語検索、100 ほどの数独などがあります。

各ゲームには多くのモードもあります。したがって、各単語検索を実行する方法は 5 つほどあります (時間指定、時間指定なしなど)、数独を再生する 5 つの方法などがあります。

各ゲームモードとパズルの組み合わせには、多くのハイスコアがあります。したがって、ワードサーチ #3 のタイミングで再生すると、特定のハイスコア テーブルが表示されます。同じパズルを時間制限なしでプレイすると、別のハイスコア テーブルが表示され、#4 の時間を制限してプレイすると、3 つ目のハイスコア テーブルが表示されます。

最後に、各ハイスコアには 1 人のユーザーがいます。

私が最初に作った方法は、各ゲームには多くのパズルとモードがあり、各パズルには多くのハイスコアがあり、各ハイスコアには 1 人のユーザーがいるというものでした。お分かりのように、これはあまり意味がありません。ハイスコアがパズルに属しているのに、モードに属していないのはなぜでしょうか? ハイスコ​​アを表示するときは、Game->Puzzle->Highscore を表示し、ハイスコアのモード=現在のモードという条件を追加します。関係が明確なので、条件が必要な理由はありません。

だからこれは私が持っていたものです:

Game->Puzzle->Highscore->User
    ->Mode

これを構造化するより良い方法は、パズルとモードとの HABTM 関係であることに気付きました。したがって、各ゲームには多くの mode_puzzle があり、各 mode_puzzle には 1 つのモード、1 つのパズル、および多くのハイスコアがあります。

したがって、次のように修正できます。

Game (has many)->ModePuzzle (has many)->HighScore (has one)->User
                            (has one) -> Mode
                            (has one) -> Puzzle

これに関する問題は、ゲームに新しいモードを追加したり、ゲームに新しいパズルを追加したりするときに、手動で作成する必要があるこの面倒な新しいテーブルに対処する必要があることです。新しいテーブル全体を作成することなく、この関係を保持します。各ゲームでは、どのモードでもどのパズルでもかまいませんが、なぜこのテーブルを手動で作成する必要があるのでしょうか?

人々はベイクを使用することを提案しましたが、私が見たところ、ベイクはモデルを自動生成しますが、テーブル自体を自動生成する必要があります。

解決策は結合などに関係していると感じていますが、MySQL結合やcakephpがそれらを処理する方法などについては経験がありません。また、各パズルには多くのモードがあり、各モードには多くのハイスコアがあると言われましたが、各パズルに多くのモードがあるか、各モードに多くのパズルがあるかに違いがないため、これを行いたくありません...そして私は構造全体なので、パズルごとにすべてのモードを繰り返す必要がある場合、またはその逆の場合、配列は巨大になります。誰でもこの問題の解決策を持っていますか?

4

1 に答える 1

1

CakePHP が提供するモデルの関連付けをよく理解する必要があるかもしれません。私が提案する解決策は次のとおりです。

class Game extends AppModel {
    public $hasMany = array('Puzzle');
    ...
}
class Mode extends AppModel {
    public $hasMany = array('Puzzle');
    ...
}
class Puzzle extends AppModel {
    public $belongsTo = array('Game', 'Mode');
    public $hasMany = array('HighScore');
    ...
}
class User extends AppModel {
    public $hasMany = array('HighScore');
    ...
}
class HighScore extends AppModel {
    public $belongsTo = array('Puzzle', 'User');
    ...
}

puzzlesテーブルには 2 つの外部キーgame_idmode_id. テーブルと同じようにhigh_scores、その外部キーは および である必要がpuzzle_idありuser_idます。モードとゲームに関連するパズルの構成は、基本的にカテゴリであるため、十分に明白だと思います。ハイスコ​​ア テーブルは、本質的に、パズルとユーザー (多くのユーザーが多くのゲームをプレイする) との間の "所有し、多くに属する" 関係であり、少し余分な情報 (スコア) が含まれています。

この解決策は、質問の最初の数行を読んでいるときに行ったように、関係をスケッチすれば明らかです。

 Game  Mode
    \  /
     \/
   Puzzle  User
        \  / 
         \/
      HighScore
于 2013-05-01T18:08:15.077 に答える