Cakephp 3 - Players/Matches 关系的正确关联类型是什么?

Cakephp 3 - what's the right association type for Players/Matches relation?

在我的 cakephp3 应用程序中,我有一个玩家 table 和一个记录两个玩家之间完成的每​​场比赛的比赛 table。我的 table 比赛的结构是:

我定义了 Players 和 Matches 之间的关联如下:

// in src/Model/Table/PlayersTable.php
$this->hasMany('Victories', [
    'className' => 'Matches',
    'foreignKey' => 'winner_id'
]);
$this->hasMany('Losses', [
    'className' => 'Matches',
    'foreignKey' => 'loser_id'
]);

当我想检索一个球员及其所有比赛时,我会这样做:

// in src/Controller/PlayersController.php
$player = $this->Players->findById($user_id)->contain(['Victories', 'Losses'])->first();

但这不是很方便,因为要将所有玩家的比赛放在一个地方,我必须合并 $player->victories$player->losses。 另外,我不能轻易执行像 "get a player with its 50 last matches".

这样的简单请求

所以我觉得我的数据库模式不理想,我可以改进。但我真的不知道怎么做。有什么建议吗?

正确的模式是从匹配项中删除 winner_idloser_id,然后将它们放入另一个可以称为 contenders

的 table ]

Table 竞争者:

* match_id
* player_id
* has_won (boolean)

并且您使用 hasMany:

将您的 table 比赛与竞争者相关联
$this->hasMany('Contenders');

现在您还可以使用 belongsToMany 关联将 Matchers 关联到 Players:

$this->belongsToMany('Players', ['through' => 'Contenders']);

您还可以将玩家 table 关联为胜利和失败:

$this->belongsToMany('Victories', [
    'className' => 'Matches',
    'through' => 'Contenders'
    'conditions' => ['Contenders.has_won' => true]
]);

$this->belongsToMany('Losses', [
    'className' => 'Matches',
    'through' => 'Contenders'
    'conditions' => ['Contenders.has_won' => false]
]);

最后你还可以通过添加另一个belognsToMany:

来了解一个玩家的所有比赛
$this->belongsToMany('Matches');