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匹配
。那不是我想要的