与自定义数据透视表的多对多关系

时间:2020-10-10 19:24:18

标签: php laravel relationship

我在项目数据库中有4个表:

users (id, name)
teams (id, name)
team_members (id, user_id, team_id)
team_member_permissions (team_member_id, team_id)

我需要建立用户团队。我当前的解决方案是在teamMembers模型中创建User关系:

public function teamMembers()
{
    return $this->hasMany(TeamMember::class);
}
members模型中

Team关系:

public function members()
{
    return $this->hasMany(TeamMember::class);
}
permissions模型中

TeamMember关系:

public function permissions()
{
    return $this->belongsToMany(Permission::class);
}

但是我该如何优化呢?例如,要让所有团队供用户使用,我需要使用

Team::whereHas('teamMember', function($query) use ($user){
    $query->where('user_id', $user->id);
})->paginate();

但是我如何实现一个包含所有用户团队的关系,以使用户团队使用一串代码(例如$user->teams)?

1 个答案:

答案 0 :(得分:1)

我建议您对team_members表使用多对多关系,以明确提及枢纽。

用户模型:

public function teams()
{
    return $this->belongsToMany(Team::class, 'team_members');
}

团队模型:

public function users()
{
    return $this->belongsToMany(User::class, 'team_members');
}

由于您要在teamMember表上使用whereHas子句,因此我认为您要根据所有属于该用户的团队都基于team_members表这一事实来提取团队。

因此,您可以按照上述多对多关系指定表名。

现在您可以使用

$user->teams