Laravel 5.1 Eloquent与具有两个用户id列的表的关系

时间:2015-10-20 23:52:14

标签: laravel laravel-5 eloquent laravel-5.1

我有一个体育应用程序,其列表为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,但我不确定除了只是分别得到每个结果,然后在继续之前将它们合并,或者是否甚至可以做出理想的结果?这是否意味着重新配置数据库表?

1 个答案:

答案 0 :(得分:2)

我认为您应该重新配置表格,以便Competitor拥有Match的外键而不是相反的方式,然后只需添加类似competitor_type字段的内容即可有playeropponent值。这样Match hasMany CompetitorCompetitor belongsToMatch以及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