Lumen 5.4 在两列上与同一模型有很多关系
Lumen 5.4 hasMany relationship on two columns to same model
我有两个table:玩家和战斗。
当玩家居住在另一个玩家时,将在战斗 table 中插入一个新行,其中挑战者玩家的 ID 存储在 player1_id 列中,被挑战的玩家是存储在 player2_id
我的战斗table是这样的:
- id
- player1_id(挑战者玩家)
- player2_id(挑战玩家)
- ...
我需要的是在玩家与匹配任一列的战斗之间建立 hasMany 关系。
我找到了一个几乎相同问题的解决方案,并尝试了用户 Colling James 的建议,但它对我不起作用。
我尝试的另一个解决方案是根据 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());
}
但是我没有成功。
我认为在您的情况下 return 一个 hasMany
对象并不重要,因为它不可能添加。我认为没有解决方案,因为 1 对 n 关系需要一个字段作为外键,而不是 or
语句。
如果你只想return数组中的战斗,你可以这样做:
public function battles() {
return App\Battle::where('player1_id', $this->id)->orWhere('player2_id', $this->id)->get();
}
在这种情况下,您只有一个查询。否则你可以启动 2 有很多查询,你 link 首先查询一个 id,而不是另一个 id,然后合并它们,但我认为上面的解决方案是最简单的。
如果你想使用 has many 你可以试试这个(也许它不起作用,因为数据库中没有设置外键)
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());
}
我有两个table:玩家和战斗。 当玩家居住在另一个玩家时,将在战斗 table 中插入一个新行,其中挑战者玩家的 ID 存储在 player1_id 列中,被挑战的玩家是存储在 player2_id
我的战斗table是这样的:
- id
- player1_id(挑战者玩家)
- player2_id(挑战玩家)
- ...
我需要的是在玩家与匹配任一列的战斗之间建立 hasMany 关系。
我找到了一个几乎相同问题的解决方案,并尝试了用户 Colling James 的建议
我尝试的另一个解决方案是根据 Acasar 关于 https://laracasts.com/discuss/channels/eloquent/combining-multiple-hasmany-relationships-into-one-model-relation-query-builder
的建议使用 unionpublic function battles() {
return $this->hasMany('App\Battle')->union($this->hasMany('App\Battle')->toBase());
}
但是我没有成功。
我认为在您的情况下 return 一个 hasMany
对象并不重要,因为它不可能添加。我认为没有解决方案,因为 1 对 n 关系需要一个字段作为外键,而不是 or
语句。
如果你只想return数组中的战斗,你可以这样做:
public function battles() {
return App\Battle::where('player1_id', $this->id)->orWhere('player2_id', $this->id)->get();
}
在这种情况下,您只有一个查询。否则你可以启动 2 有很多查询,你 link 首先查询一个 id,而不是另一个 id,然后合并它们,但我认为上面的解决方案是最简单的。
如果你想使用 has many 你可以试试这个(也许它不起作用,因为数据库中没有设置外键)
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());
}