2015-03-31 56 views
0

在我的cakephp3應用程序中,我有一個Players表和一個Matches表,用於記錄兩個玩家之間完成的每​​場比賽。我的表的結構匹配是:Cakephp 3 - 玩家/匹配關係的正確關聯類型是什麼?

  • ID
  • 創建< - 日期時間
  • winner_id < - 球員誰贏得了比賽的ID。
  • loser_id < - 輸掉比賽的球員的ID。

我已經定義了玩家之間的關聯和匹配如下:

// 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。 另外,我不能輕鬆執行簡單的請求,例如「讓玩家獲得其最後50場比賽」。

所以我覺得我的數據庫模式不理想,我可以改進。但我真的不知道如何。任何建議?

回答

1

正確的模式將是去除winner_idloser_id了比賽,並把它們變成可稱爲contenders

表爭奪另一張表:

* match_id 
* player_id 
* has_won (boolean) 

而你關聯的表匹配競爭者使用hasMany

$this->hasMany('Contenders'); 

現在你也可以關聯M atchers到使用belongsToMany公會玩家:

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

您還可以關聯Players表有勝利和損失:

$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'); 
+0

再次感謝您的幫助! – PGBI 2015-03-31 15:59:17