Laravel:团队和比赛之间的关系

时间:2016-01-04 22:25:15

标签: php laravel eloquent

我目前正在制作一个小型网站,其中排球Teams将会播放一些Matches。这就是我现在所拥有的:

Match型号:

class Match extends Model
{
    public function Team1() {
        return $this->belongsTo('App\Team', 'team_1');
    }

    public function Team2() {
        return $this->belongsTo('App\Team', 'team_2');
    }
}

例如,$match->team1->name效果很好。

Team型号:

class Team extends Model
{
    public $timestamps = false;

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

但是$team->matches会出现此错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'matches.team_id' in 'where clause'

这是正常的,因为Laravel试图在数据库中找到team_id字段,但实际上有两个:team_1team_2

我认为我的模特之间的关系可能是错的,但我不确定。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您对所拥有的数据结构使用了正确的关系,但团队可以通过两种方式进行匹配。

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

    public function matchesAsTeam2()
    {
        return $this->hasMany('App\Match', 'team_2');
    }
}

要在单个关系中获取所有匹配项有点棘手,并且需要了解->union()方法。

public function matches()
{
    return $this->matchesAsTeam1()->union($this->matchesAsTeam2());
}

这将获得所有比赛,其中球队是比赛的第1组或第2组。

不幸的是,这并不适用于急切加载。例如

App\Team::with('matches')->get();

将会在该小组team_1之间获得匹配,但不会在该小组team_2之间进行匹配。如果您发现自己在->with('matches')->has('matches')->whereHas('matches', function($subquery) {})的上下文中使用这些关系,则根据我的经验,这种方法会有问题。

我可能会考虑在这里使用多对多的关系,尽管"很多"在第二种情况下总是2.这将涉及定义match_team表:

Schema::create('match_team', function($table) 
{
    $table->increments('id');
    $table->integer('team_id')->unsigned();
    $table->foreign('team_id')->references('id')->on('teams');
    $table->integer('match_id')->unsigned();
    $table->foreign('match_id')->references('id')->on('matches');
});

然后你的关系最终成为

class Team extends Model
{
    public function matches()
    {
        return $this->belongsToMany(Match::class);
    }
}

class Match extends Model
{
    public function teams()
    {
        return $this->belongsToMany(Team::class);
    }
}

如果你使用这种方法,你需要确保你强制执行每场比赛只有2支球队。