我目前正在制作一个小型网站,其中排球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_1
和team_2
。
我认为我的模特之间的关系可能是错的,但我不确定。
感谢您的帮助!
答案 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支球队。