通过与两个数据透视表模型相关的模型访问数据透视表值

时间:2018-11-30 02:07:06

标签: php laravel laravel-5 eloquent

说我有一张游戏的比赛表,其中每场比赛保持对手得分,并且比赛可以有任意数量的球员,目前的关系如下:

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。但是很显然,BetPlayer无关,但通过枢轴共享,但是它共享枢纽存在的两种关系,因此信息已经存在,可以将其附加到枢纽表直接。

当然,可以简单地获得相关的比赛,然后遍历该比赛的球员,例如:

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分页的能力?

0 个答案:

没有答案