Laravel 5.1具有两个用户id列的表的雄辩关系

Laravel 5.1具有两个用户id列的表的雄辩关系,laravel,laravel-5,eloquent,laravel-5.1,Laravel,Laravel 5,Eloquent,Laravel 5.1,我有一个体育应用程序,它有一个竞争对手列表(Competitors table)和一个比赛(matches table),其中在一场比赛中有两名竞争对手,因此matches table中有一列显示具有一个竞争对手关系的玩家,另一列显示具有一个竞争对手关系的对手,一开始看起来还可以,但匹配模型的关系必须如下所示: 当前匹配模型 public function player() { return $this->hasOne('App\Competitor'); } public fu

我有一个体育应用程序,它有一个
竞争对手列表(Competitors table
)和一个
比赛(matches table)
,其中在一场比赛中有两名竞争对手,因此matches table中有一列显示具有一个竞争对手关系的
玩家,另一列显示具有一个竞争对手关系的
对手,一开始看起来还可以,但匹配模型的关系必须如下所示:

当前匹配模型

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');
}
而不是像这样:

理想匹配模型

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');
}
竞争对手模型的关系变得更加丑陋,因为:

当前竞争对手车型

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');
}
而不是像这样:

理想的竞争对手模式

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');
}
如果没有两列,每个玩家对应一列,那么就应该这样看,并获得所有玩家的比赛,或者使用渴望加载或其他方式获得比赛中的玩家,但事实并非如此


我希望能够使用
belong来匹配
,并且
有许多竞争对手
,就像我上面概述的那样,但我不知道如何才能做到这一点,除了单独获得每个结果,然后在继续之前将它们合并,或者是否有可能实现理想?这是否意味着要重新配置数据库表?

我认为您应该重新配置表,以便
竞争对手
持有
比赛
的外键,而不是相反,然后只需添加类似于
竞争对手
类型的字段,该字段可以有
玩家
对手
价值这样一来,一场
比赛
就有许多
竞争者
,一个
竞争者
就属于
一场
比赛
和一个
竞争者
既可以是
玩家
也可以是
对手

更新

要使
匹配
车型参考每种类型的
竞争对手
,您可以执行以下操作:

公共功能竞争对手()
{
返回$this->hasMany('App\Competitor');
}
公共函数播放器()
{
返回$this->hasOne('App\Competitor')->其中('Competitor_type','player');
}
公共职能()
{
返回$this->hasOne('App\Competitor')->其中('Competitor_type','opporter');
}

所以你可以在上面使用有说服力的方法,比如:
$match->player->name
或者
$match->opporter->name

嗨,一场比赛怎么会有两名球员这样的参照嗨,我喜欢。我没想到在方法上会像那样连锁。你能做这样的事吗<代码>返回$this->hasOne('App\Competitor','Competitor\u id','player\u id')->hasOne('App\Competitor','Competitor\u id','accounter\u id')
获取所有竞争对手的列表。不幸的是,没有。您无法链接关系方法。为什么要这样做?由于Matches表中有一个玩家和对手列,但在数据库之外的所有情况下,我实际上并不关心他们是玩家还是对手(至少目前不关心基本CRUD),我只想获得一场比赛中的所有竞争者,在本例中,这将是两个竞争对手ID,但来自不同的列。类似地,反过来说,我只希望竞争对手进行比赛,而不管他们是玩家还是对手。我的解决方案要求您将外键从
比赛
表移动到
竞争对手
表。如果您实现了我上面发布的
Match
模型关系,您可以通过执行类似
$Match->competitors
的操作,在一场比赛中获得所有
竞争对手
,并且它应该返回
App\Competitor
集合。相反,您可以使用理想的方式设置您的
App\Competitor
模型,并可以执行类似
$Competitor->match
.Hi的操作。我也有同样的问题。你如何解决这个问题?如果
竞争对手
持有
匹配
外键
竞争对手
将仅附加到1
匹配
。那不是我想要的