0

私は小さなゲームをプログラミングしており、プレイヤーとマッチを表すデータベースが必要です。

プレーヤーには、名前、プレーヤー ID、およびランクがあります。試合には ID と 2 人のプレイヤーがいます。

プレーヤー

  • id (bigint)
  • 名前 (文字列)
  • プレーヤーID (文字列)
  • ランク (整数)

マッチ

  • id (bigint)
  • matchID (文字列)
  • playerOne (プレイヤー)
  • playerTwo (プレイヤー)

最終的には、プレーヤーで「一致」関係を持ちたいのですが、理解できない点は、同じタイプのエンティティを 2 つ持つエンティティを作成する方法と、どのタイプの関係を使用すればよいかということです。

1対1の関係でやってみましたが、UNIQUE条件が発生するのが難点です。

どんなアイデアでも大歓迎です。

乾杯。

シリル

4

2 に答える 2

2

多対多の関係が必要です。これは通常、「中間」または「リンク」テーブルで行われます。この例では、PlayedMatchテーブルはリンク テーブルです。

これは事実上、Player と Match の間の単一の多対多の関係です。ただし、2 つの一対多の関係で表されます。

プレーヤー [1] --> [n] PlayedMatch

マッチ [1] --> [n] PlayedMatch

Player
  Id
  Name
  Rank

Match
  Id

PlayedMatch
  Id
  MatchId
  Player1Id
  Player2Id

PlayerId と MatchId という名前の文字列プロパティがいくつかあるようです。これらの名前は通常、外部キーの関係に使用されるため、できる限り避けてください。

おそらく、 (Player へのリンク)のPlayedMatchようなテーブルにさらにいくつかのプロパティが必要になるでしょう。WinnerId

上記の SQL クエリは次のようになります。

SELECT 
  *
FROM
  PlayedMatch pm
    INNER JOIN Player p1 ON pm.Player1Id = p1.Id
    INNER JOIN Player p2 ON pm.Player2Id = p2.Id
    INNER JOIN Match m ON pm.MatchId = m.Id
于 2013-03-14T22:56:25.377 に答える
1

プレーヤーごとにすべての試合を簡単に見つけたい場合は、ManyToMany関係を使用する必要があります。以下は、クラスがどのように見えるかの簡略化されたスニペットです。

class Player {

    /**
     * @ORM\ManyToMany(targetEntity="Match", mappedBy="players")
     */
    protected $matches;

}

class Match {

    /**
     * @ORM\ManyToMany(targetEntity="Player", inversedBy="matches")
     */
    protected $players;

}

次に、ルート ディレクトリから次のコマンドを実行します。

php app/console doctrine:generate:entities Your/AwesomeBundle/Entity

また、次のような方法を使用できるようになります。

Match::getPlayers()
Match::addPlayer()
Player::addMatch() // probably will have an 'e' at the end of the word match
Player::getMatches() // which is the one that will give you all matches of a user

コードで試合ごとのプレイヤー数を制限する必要があります。

于 2013-03-15T05:04:48.843 に答える