我正在编写一个小游戏,需要一个代表玩家和匹配的数据库。
玩家有名字,玩家ID和等级。 一场比赛有一个ID和两名球员。
最终,我想在播放器中有一个“匹配”关系,但我不明白的是如何让一个实体有两个相同类型的实体,我应该使用什么类型的关系?
我尝试了一个onetoone关系,但它创建的UNIQUE条件是个问题。
欢迎任何想法。
干杯。
西里尔
答案 0 :(得分:2)
你需要多对多的关系。这通常使用“中间”或“链接”表来完成。在此示例中,PlayedMatch
表是链接表。
这实际上是播放器和匹配之间的单个多对多关系。然而,它由2个一对多关系表示:
播放器[1] - > [n] PlayedMatch
匹配[1] - > [n] PlayedMatch
Player
Id
Name
Rank
Match
Id
PlayedMatch
Id
MatchId
Player1Id
Player2Id
我看到你有一些名为PlayerId和MatchId的字符串属性。如果可以,请避免使用这些名称,因为它们通常用于外键关系。
您可能希望在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
答案 1 :(得分: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
您需要在代码中限制每场比赛的球员数量。