2017-07-03 34 views
0

我有兩個表格:玩家和戰鬥。 當玩家停留一個又一個,一個新的行插入在其中的挑戰者玩家ID存儲在player1_id列和挑戰玩家存儲在player2_id流明5.4有兩列相同的型號有很多關係

我的戰表看起來像這樣的戰鬥表:

  • ID
  • player1_id(挑戰者播放器)
  • player2_id的(攻擊球員)
  • ...

我需要的是在玩家之間有一個hasMany關係來匹配任一列。


我發現了一個幾乎相同的問題的解決方案,並試圖哪些用戶科林詹姆斯建議https://stackoverflow.com/a/29775608/1481559但它並沒有爲我工作。


另一種解決方案我試圖用工會按Acasar的建議上https://laracasts.com/discuss/channels/eloquent/combining-multiple-hasmany-relationships-into-one-model-relation-query-builder

public function battles() { 
    return $this->hasMany('App\Battle')->union($this->hasMany('App\Battle')->toBase()); 
} 

,但我沒有成功。

回答

2

我想在你的情況下,它並不重要返回一個hasMany對象,因爲它是不可能增加。我認爲沒有解決方案,因爲1對n關係需要一個字段用於外鍵,而不是or-陳述。

如果你只是想在一個數組,你可以這樣做返回的戰鬥:

public function battles() { 
    return App\Battle::where('player1_id', $this->id)->orWhere('player2_id', $this->id)->get(); 
} 

在這種情況下,你只需要一個查詢。否則,你可以啓動2有很多查詢,你首先鏈接到一個ID,而不是另一個,然後合併它們,但我認爲上面的解決方案是最簡單的。

如果你要使用有很多,你可以試試這個(也許這是行不通的,因爲外鍵未在DB中設置)

public function battlesChallenger() { 
    return $this->hasMany('App\Battle', 'player1_id'); 
} 

public function battlesChallenged() { 
    return $this->hasMany('App\Battle', 'player2_id'); 
} 

public function battles() { 
    return $this->battlesChallenger()->merge($this->battlesChallengered()); 
} 
+0

你的第二個建議,沒有工作,它給了我「調用模型[App \ Player]上的未定義關係[戰鬥]」。無論哪種方式,我決定走第一條路。非常感謝! – Amorim

+0

我認爲,因爲合併調用不會給你一個關係,但一個數組返回。不用謝 – mimo