Laravel中如何筛选出不属于ID为6的Group的所有User?
问题需求
筛选出所有不属于ID为6的Group的用户。
数据库表结构
1. users表
| id | name |
|---|---|
| Cell 1 | Cell 2 |
| Cell 3 | Cell 4 |
2. group表
| id | name |
|---|---|
| Cell 1 | Cell 2 |
| Cell 3 | Cell 4 |
3. group_users关联表
| id | user_id | group_id |
|---|---|---|
| Cell 1 | Cell 2 | Cell 4 |
| Cell 3 | Cell 4 | Cell 6 |
模型关联代码
Group模型的users关联
// 群组的所有成员用户 public function users() { return $this->belongsToMany(User::class); }
User模型的groups关联
// 用户所属的所有群组 public function groups() { return $this->belongsToMany(Group::class); }
尝试的代码及问题
我尝试了以下代码,但无法将获取到的$users转换为ID数组,请求解决:
public function show(Group $group) { //获取该群组的所有成员 $users = $group->users()->get() return Inertia::render('Clients/Show', [ 'users' => Group::whereNotIn('id', $users)->get() ]); }
解决方案
你的代码存在两个核心问题:
- 目标是筛选用户而非群组,应该调用
User::whereNotIn而非Group::whereNotIn - 直接传入Eloquent集合到
whereNotIn会报错,需要提取集合中的用户ID数组
修正代码(基础版)
public function show(Group $group) { // 获取该群组所有成员的ID数组 $groupUserIds = $group->users()->pluck('id'); // 筛选出不在该群组的所有用户 $usersNotInGroup = User::whereNotIn('id', $groupUserIds)->get(); return Inertia::render('Clients/Show', [ 'users' => $usersNotInGroup ]); }
优化方案(高性能版)
如果希望减少数据库查询次数,可使用whereDoesntHave直接查询无关联的用户:
public function show(Group $group) { $usersNotInGroup = User::whereDoesntHave('groups', function ($query) use ($group) { $query->where('groups.id', $group->id); })->get(); return Inertia::render('Clients/Show', [ 'users' => $usersNotInGroup ]); }
内容的提问来源于stack exchange,提问作者Lindani Dube
相关产品推荐
相关产品推荐

