Cakephp 3 - Players/Matches 关系的正确关联类型是什么?
Cakephp 3 - what's the right association type for Players/Matches relation?
在我的 cakephp3 应用程序中,我有一个玩家 table 和一个记录两个玩家之间完成的每场比赛的比赛 table。我的 table 比赛的结构是:
- id
- 创建 <-- 日期时间
- winner_id <-- 赢得比赛的玩家的 id。
- loser_id <-- 输掉比赛的玩家的id。
我定义了 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_id
和 loser_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');
在我的 cakephp3 应用程序中,我有一个玩家 table 和一个记录两个玩家之间完成的每场比赛的比赛 table。我的 table 比赛的结构是:
- id
- 创建 <-- 日期时间
- winner_id <-- 赢得比赛的玩家的 id。
- loser_id <-- 输掉比赛的玩家的id。
我定义了 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_id
和 loser_id
,然后将它们放入另一个可以称为 contenders
Table 竞争者:
* match_id
* player_id
* has_won (boolean)
并且您使用 hasMany
:
$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');