在Laravel

时间:2016-02-11 13:39:47

标签: laravel laravel-5 eloquent query-builder laravel-5.2

我完全陷入如何只从模型中获得两个相关的条目(团队)(匹配)。

问题:

以下代码获得正确匹配,但所有现有团队。一场比赛只有两个球队相互比赛,这些都是我无法明确得到的球队: - )

Match::with('teams')
    ->whereBetween('elo', [($request->user()->elo - 100), ($request->user()->elo + 100)])
    ->where('winner_id', 0)
    ->where('type', 'normal')
    ->get();

目标:

我希望这两支球队在比赛结束后创建球队,将球员分配给两支球队之一。但是如果我的选择是正确的,那么仅仅选择最后两个条目就不够节省了!

  1. 创建匹配(检查)
  2. 创建2个团队(检查)
  3. 将球员分配给其中一支球队(卡住)
  4. 表格

    匹配(id,winner_id,...)
    团队(id, match_id ,......)
    玩家(id,user_id, team_id ,...)

    关系:

    class Match extends Model
    {
        protected $table = 'matches';
    
        public function teams()
        {
            return $this->hasMany(Team::class);
        }
    
        public function winner()
        {
            return $this->belongsTo(Team::class, 'winner_id');
        }
    }
    

    你能告诉我这需要什么吗?

1 个答案:

答案 0 :(得分:1)

根据你在这篇文章的评论中告诉我的内容,一场比赛将有多个球员和多个球队(2)并且球员和球队存在/属于一场比赛。考虑到这一点,你正在寻找一套相当直接的关系/

匹配模型

class Match extends Model {
    protected $table = 'matches';

    public function teams()
    {
        return $this->hasMany(Team::class);
     }

    public function winner()
    {
        return $this->belongsTo(Team::class, 'winner_id');
    }
}

团队模型

class Team extends Model {
    protected $table = 'teams';

    public function match()
    {
        return $this->belongsTo(Match::class);
    }

    public function players()
    {
        return $this->hasMany(Player::class);
    }
}

玩家模型

class Player extends Model {
    protected $table = 'players';

    public function team()
    {
        return $this->belongsTo(Team::class);
     }
}

现在要将玩家分配给其中一个团队(因此匹配),您必须使用associate方法。你如何做到这取决于你开始使用的数据。如果您已经了解该团队,那么您可以这样做:

$team = Team::find(123);
$player = Player::find(8734); //could also have created new Player here

$team->players()->associate($player);

如果您不了解团队,但只知道匹配,您可以这样做:

$match = Match::with('teams')->find(9003);
$team = $match->teams[0]; //choose teams[1] for second team, etc.
$player = Player::find(8734); //could also have created new Player here

$team->players()->associate($player);

您可以随时获取所有相关数据:

Match::with('teams.players')->find(9003);

这将返回比赛数据以及参加该特定比赛的球队以及属于该球队的球员。