我的数据库中有一个存储额外信息的数据透视表。它有2个外键和一个附加字段。这是它的样子:
EventTeam
int event_id (fk)
int team_id (fk)
boolean home
这里的意图是一个事件可能有很多团队(实际上,它必须至少有2个,但这不是数据库约束),并且团队可能参与许多事件。但是,对于每个活动 - 团队关系,我还想跟踪该团队是否被视为该活动的主队。
如何定义我的模型?我是否拥有EventTeam模型,还是在Team和Event模型中定义belongsToMany
关系?如果我需要一个单独的模型,我在其中定义了什么关系?如果我不这样做,如何将布尔字段添加到使用的数据透视表?我真的不知道该怎么做。
答案 0 :(得分:2)
您本身并不需要EventTeam模型,但它可以为播种者派上用场,或者您打算将模型附加到应用中其他任何地方的EventTeam连接。这应该有效:
活动模式:
public function teams()
{
return $this->belongsToMany('Team');
}
团队模型:
public function events()
{
return $this->belongsToMany('Event');
}
对于额外的布尔值,您可以使用 - > withPivot()。
$this->belongsToMany('Event')->withPivot('is_home');
有关详细信息,请参阅http://laravel.com/docs/eloquent#working-with-pivot-tables。
更新的答案:
1)我会把它放在两个模型中,这样你就可以毫无问题地从双方访问数据透视数据。
2)确实应该是列名。
3)就像我说在这种情况下它并不是真的需要你,但你可以这样做:
EventTeam模型:
public function event()
{
return $this->belongsTo('Event');
}
public function team()
{
return $this->belongsTo('Team');
}
答案 1 :(得分:1)
在您的关系定义上添加withPivot('home')
,然后您可以像这样访问它:
$team->events->first()->pivot->home; // 0/1
$event->teams->first()->pivot->home; // 0/1
first
只是在此处获取单个相关模型的一个示例。
现在,接下来就是将该值添加到关系中:
$team = Team::find($id);
$event = Event::find($eventId);
$team->events()->attach($event, ['home' => 1]);
// or
$team->events()->attach($eventId, ['home' => 1]);
// or using sync
$event->teams()->sync([1,5,15], ['home' => 0]);
另一件事是查询该字段:
// load first team and related events, that the team hosts
$team = Team::with(['events'=>function ($q) {
$q->wherePivot('home', 1);
}])->first();
// load only teams that are hosts for any event
$hostTeams = Team::whereHas('events', function ($q) {
// wherePivot won't work here!
$q->where('event_team.home', 1);
})->get();
等等。