使用whereHas查询关联数据:用户所属组的任务查询问题
问题解决:查询当前用户所在组的任务
你的代码返回空结果的核心原因是whereHas里的条件逻辑错误:你把group_id和用户ID做对比,而group_id是组的标识ID,和用户ID不属于同一维度,自然匹配不到任何数据。
下面是两种可行的修复方案:
方案一:利用模型关联查询
假设你的Group模型已经定义了和User的多对多关联(通过group_user中间表),Task模型定义了和Group的关联,可以这样写:
public function index() { $userId = Auth::user()->id; return TaskResource::collection( Task::latest() ->whereHas('group', function($query) use($userId) { // 校验当前组是否包含当前用户 $query->whereHas('users', function($subQuery) use($userId) { $subQuery->where('users.id', $userId); }); }) ->get() ); }
必要的模型关联定义
确保你的模型里已经配置好关联:
- Task模型:
public function group() { return $this->belongsTo(Group::class); }
- Group模型:
public function users() { return $this->belongsToMany(User::class, 'group_user'); }
方案二:先获取用户组ID再筛选任务
这种方式更直接,先从中间表拿到用户所属的所有组ID,再用whereIn筛选任务:
public function index() { $userId = Auth::user()->id; // 获取当前用户加入的所有组ID $userGroupIds = DB::table('group_user') ->where('user_id', $userId) ->pluck('group_id'); return TaskResource::collection( Task::latest() ->whereIn('group_id', $userGroupIds) ->get() ); }
两种方案都能实现需求,方案二更适合数据量较大的场景,性能更优。
内容的提问来源于stack exchange,提问作者Walid
相关产品推荐
相关产品推荐

