我在项目数据库中有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
)?
答案 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