我有一个体育应用程序,其列表为Competitors (competitors table
)和Match (matches table)
,其中匹配中有两个竞争对手,因此匹配表中有一列{{1} },以及player with hasOne competitor relationship
的另一列,一开始似乎没问题,但匹配模型的关系必须如下所示:
当前比赛模式
opponent with hasOne competitor relationship
而不是像这样:
理想匹配模型
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');
}
如果每个玩家没有两个列,那么它会看起来应该是这样,让所有玩家匹配,或者使用渴望加载或其他任何东西让玩家参加比赛,但那不是&# 39;是的。
我希望能够像上面列出的那样使用public function match()
{
return $this->belongsTo('App\Match');
}
和belongsTo match
,但我不确定除了只是分别得到每个结果,然后在继续之前将它们合并,或者是否甚至可以做出理想的结果?这是否意味着重新配置数据库表?
答案 0 :(得分:2)
我认为您应该重新配置表格,以便Competitor
拥有Match
的外键而不是相反的方式,然后只需添加类似competitor_type
字段的内容即可有player
或opponent
值。这样Match
hasMany
Competitor
,Competitor
belongsTo
和Match
以及Competitor
可以是{{1} }或player
。
<强>更新强>
要让opponent
模型引用每种类型的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
。