Laravel Matages,Teams,Players之间的关系和索引

时间:2016-01-23 17:58:08

标签: database laravel

我正在努力思考如何使用干净的方式在Laravel中建立三种模式之间的工作关系。

有大量匹配,其中包含 2个小组,其中每个小组都有 5个玩家
注意:玩家不是用户,因此每场比赛都会产生新的球队和球员。

匹配

class Match extends Model
{
    public function teams()
    {
        return $this->hasMany('App\Team');
    }
}

小组

class Team extends Model
{
    public function players()
    {
        return $this->hasMany('App\Player');
    }

    public function match()
    {
        return $this->belongsTo('App\Match');
    }
}

球员

class Player extends Model
{
    public function team()
    {
        return $this->belongsTo('App\Team');
    }
}

我的问题是我在可爱的Laravel文档中找不到使用带有两个索引的数据库表的解决方案。
具体:匹配条目有赢家和更宽松的团队。如何以雄辩的方式告诉Laravel?

匹配

    Schema::create('matches', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('winner_team_id')->index();
        $table->integer('looser_team_id')->index();

小组

    Schema::create('teams', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('player_1')->index();
        $table->integer('player_2')->index();
        $table->integer('player_3')->index();
        $table->integer('player_4')->index();
        $table->integer('player_5')->index();

球员

    Schema::create('players', function (Blueprint $table) {
        $table->increments('id');

这种方法是“不干净的”还是我错过了文档中显而易见的内容,例如模型的基于关系的类更多?

我是否需要为manyToMany-relationships-approach方法设置更多像“match_teams”和“team_players”这样的表?

1 个答案:

答案 0 :(得分:0)

根据您的匹配架构,我可能会修改您的匹配关系,如下所示:

class Match extends Model
{
    public function teamA()
    {
        return $this->hasOne('App\Team');
    }

    public function teamB()
    {
        return $this->hasOne('App\Team');
    }

    public function winningTeam()
    {
        return $this->hasOne('App\Team');
    }
}

假设您的比赛总是包含两支球队。然后在你的架构中:

Schema::create('matches', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('teama_id')->index();
    $table->integer('teamb_id')->index();
    $table->integer('winningteam_id')->index(); // Loser team is one of the ids from above ID, you would write a query scope to return the loser team.
    $table->string('result');
}