Lumen 5.4在同一模型

时间:2017-07-03 20:13:42

标签: php mysql laravel eloquent lumen

我有两张桌子:球员和战斗。 当玩家居住另一个玩家时,会在战斗桌上插入一个新行,其中挑战者玩家的ID存储在 player1_id 列中,并且挑战玩家存储在 player2_id < / p>

我的战斗表看起来像这样:

  • 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

的建议使用 union
public function battles() {
    return $this->hasMany('App\Battle')->union($this->hasMany('App\Battle')->toBase());
}

但我没有成功。

1 个答案:

答案 0 :(得分:2)

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

如果您只想在阵列中返回战斗,可以执行以下操作:

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

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

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

public function battlesChallenger() {
    return $this->hasMany('App\Battle', 'player1_id');
}

public function battlesChallenged() {
    return $this->hasMany('App\Battle', 'player2_id');
}

public function battles() {
    return $this->battlesChallenger()->merge($this->battlesChallengered());
}