Laravel模型关系实现:获取用户关联企业的专属团队
解决方案
首先确保你的模型已经配置好基础关联:
基础关联配置
User 模型
public function companies() { return $this->belongsToMany(Company::class); } public function teams() { return $this->belongsToMany(Team::class); }
Team 模型
public function company() { return $this->belongsTo(Company::class); } public function users() { return $this->belongsToMany(User::class); }
专属团队关联实现
在 User 模型中添加以下方法,直接通过模型关联获取所属企业下仅属于当前用户的团队:
public function exclusiveTeams() { return $this->belongsToMany(Team::class) // 关联到用户所在的企业,确保团队属于用户的企业 ->join('company_user', 'teams.company_id', '=', 'company_user.company_id') ->where('company_user.user_id', $this->id) // 统计团队的用户数量,筛选仅含当前用户的团队 ->leftJoin('team_user as tu', 'teams.id', '=', 'tu.team_id') ->groupBy('teams.id') ->havingRaw('COUNT(tu.user_id) = 1') // 避免重复字段,仅选择团队表数据 ->select('teams.*') ->distinct(); }
使用方式
直接通过用户实例调用该关联即可获取目标团队:
$user = User::find(1); $exclusiveTeams = $user->exclusiveTeams;
代码说明
join('company_user', ...):确保筛选的团队属于当前用户关联的企业,避免跨企业的团队被选中。leftJoin('team_user as tu', ...):左连接团队用户关联表,用于统计每个团队的用户总数。groupBy('teams.id') + havingRaw('COUNT(tu.user_id) = 1'):分组后筛选出仅包含1个用户的团队。select('teams.*') + distinct():确保返回的团队数据不重复,仅保留团队表的字段。
内容的提问来源于stack exchange,提问作者ProgZi
相关产品推荐
相关产品推荐

