2015-10-20 20 views
0

我有一個包含Competitors (competitors table)和Match (matches table)的列表的運動應用程序,在匹配中有兩個競爭對手,所以匹配表有一列player with hasOne competitor relationship,而另一列opponent with hasOne competitor relationship,這似乎起初還好,但對於比賽模型中的關係必須是這樣的:Laravel 5.1擁有兩個用戶ID列的表格的雄辯關係

當前的匹配模式

public function player() 
{ 
    return $this->hasOne('App\Competitor'); 
} 

public function opponent() 
{ 
    return $this->hasOne('App\Competitor'); 
} 

,而不是像這樣:

理想的搭配模式

public function players() 
{ 
    return $this->hasMany('App\Competitor'); 
} 

,併爲競爭對手模型的關係變得更加醜陋用:

當前競爭對手型號

public function playerMatch() 
{ 
    return $this->belongsTo('App\Match', 'player_id'); 
} 

public function opponentMatch() 
{ 
    return $this->belongsTo('App\Match', 'opponent_id'); 
} 

取而代之的是這樣的:

理想競爭對手型號

public function match() 
{ 
    return $this->belongsTo('App\Match'); 
} 

如果沒有兩列一個爲每個玩家這個看起來應該的方式,讓所有的玩家匹配,或者使用獲得比賽的球員(S)急於加載或其他,但事實並非如此。

我想只能使用belongsTo matchhasMany competitors就像我上面概述的那樣,但我不確定如何使這項工作,而不是單獨獲取每個結果,然後合併它們之前進行,或者如果甚至有可能做到理想?這是否意味着重新配置數據庫表?

+0

嗨。我也有同樣的問題。你怎麼解決這個問題?如果競爭者持有匹配外鍵,競爭者將只附加到1個匹配。那不是我想要的 – LTroya

回答

2

我想你應該重新配置表,這樣一個Competitor保存了Match外鍵,而不是周圍的其他方法,然後只需添加一些像competitor_type字段可以有一個playeropponent值。這樣一個MatchhasManyCompetitor,CompetitorbelongsTo a MatchCompetitor可以是playeropponent

UPDATE

Match模式對每種類型的Competitor一個參考,你可以做到以下幾點:

public function competitors() 
{ 
    return $this->hasMany('App\Competitor'); 
} 

public function player() 
{ 
    return $this->hasOne('App\Competitor')->where('competitor_type', 'player'); 
} 

public function opponent() 
{ 
    return $this->hasOne('App\Competitor')->where('competitor_type', 'opponent'); 
} 

所以,你可以使用它Eloquent方法和做類似:$match->player->name$match->opponent->name

+0

嗨,單個比賽如何以這種方式參照兩名球員 – mtpultz

+0

嗨,我喜歡它。我沒有想到在這個方法中像這樣連鎖。你能做到這樣嗎? '返回$ this-> hasOne('App \ Competitor','competitor_id','player_id') - > hasOne('App \ Competitor','competitor_id','opponent_id');'獲得所有參賽者的名單。 – mtpultz

+0

不幸的是,沒有。你不能鏈式關係方法。你爲什麼想要這樣做? –