Lumen 5.4在两列上具有许多关系到同一模型



我有两个表:玩家和战斗。 当玩家停留在另一个行中时,战斗表上会插入一个新行,其中挑战者玩家的 id 存储在player1_id列中,被挑战玩家存储在player2_id

我的战斗表如下所示:

  • 编号
  • player1_id(挑战者玩家(
  • player2_id(挑战玩家(

我需要的是玩家之间有一个与任何一列匹配的战斗的 hasMany 关系。


我为一个几乎相同的问题找到了解决方案,并尝试了用户 Colling James 建议 https://stackoverflow.com/a/29775608/1481559 但它对我不起作用。


我尝试的另一个解决方案是根据 Acasar 的建议使用联合https://laracasts.com/discuss/channels/eloquent/combining-multiple-hasmany-relationships-into-one-model-relation-query-builder

public function battles() {
return $this->hasMany('AppBattle')->union($this->hasMany('AppBattle')->toBase());
}

但我没有成功。

我认为在您的情况下,返回hasMany对象并不重要,因为它不可能添加。我认为没有解决方案,因为 1 到 n 的关系需要一个字段作为外键,而不是or语句。

如果你只想返回数组中的战斗,你可以这样做:

public function battles() {
return AppBattle::where('player1_id', $this->id)->orWhere('player2_id', $this->id)->get();
}

在这种情况下,您只有一个查询。否则,您可以启动 2 有很多查询,您首先链接到一个 id,而不是链接到另一个然后合并它们,但我认为上面的解决方案是最简单的解决方案。

如果你想使用有很多你可以试试这个(也许它不起作用,因为外键没有在数据库中设置(

public function battlesChallenger() {
return $this->hasMany('AppBattle', 'player1_id');
}
public function battlesChallenged() {
return $this->hasMany('AppBattle', 'player2_id');
}
public function battles() {
return $this->battlesChallenger()->merge($this->battlesChallengered());
}

最新更新