说我有一张游戏的比赛表,其中每场比赛保持对手得分,并且比赛可以有任意数量的球员,目前的关系如下:
class Match extends Model {
public function players() {
return $this->belongsToMany(Player::class)->withPivot(['score']);
}
}
class Player extends Model {
public function matches() {
return $this->belongsToMany(Match::class)->withPivot(['score']);
}
}
效果很好,我可以获取一场比赛的球员,并通过数据透视表获取该场比赛的每位球员得分。我认为我做得很对。
然后,我们引入第三个模型,该模型很容易与这两个模型相关联,并跟踪游戏的哪个玩家观众下注:
class Bet extends Model {
// get the match the bet is for
public function match() {
return $this->belongsTo(Match::class);
}
// get the player the bet is for
public function player() {
return $this->belongsTo(Player::class);
}
}
但是随后我们决定要显示一个赌注列表,以及比赛中该球员与该赌注相关的最终得分,例如$bet->playerWithMatch->pivot->score
。但是很显然,Bet
与Player
无关,但通过枢轴共享,但是它共享枢纽存在的两种关系,因此信息已经存在,可以将其附加到枢纽表直接。
当然,可以简单地获得相关的比赛,然后遍历该比赛的球员,例如:
foreach ($bet->match->players as $player) {
if ($player->id == $bet->player->id) {
// yay, we got it!
return $player->pivot->score;
}
}
// this should never happen... oh but wait, isn't this a sign of bad design patterns or something?
// should we not find a way to more Eloquently represent all of this? hmm...
return null;
但是我更喜欢一种更简单的“内联”方式,我可以直接在初始查询中进行操作,并在Blade模板中使用它,例如,我感觉必须有某种方法可以使我丢失?不会进行过多的查询和/或破坏我使用Laravel分页的能力?