使用其他数据在Laravel中创建多对多关系

时间:2014-07-25 15:21:08

标签: laravel model many-to-many

我的数据库中有一个存储额外信息的数据透视表。它有2个外键和一个附加字段。这是它的样子:

EventTeam
  int event_id (fk)
  int team_id (fk)
  boolean home

这里的意图是一个事件可能有很多团队(实际上,它必须至少有2个,但这不是数据库约束),并且团队可能参与许多事件。但是,对于每个活动 - 团队关系,我还想跟踪该团队是否被视为该活动的主队。

如何定义我的模型?我是否拥有EventTeam模型,还是在Team和Event模型中定义belongsToMany关系?如果我需要一个单独的模型,我在其中定义了什么关系?如果我不这样做,如何将布尔字段添加到使用的数据透视表?我真的不知道该怎么做。

2 个答案:

答案 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();

等等。