Laravel实现用户仅查看所属团队关联Job数据的问题咨询
解决用户仅查看所属Team的Job数据问题
你的核心问题是查询逻辑中错误地将Worker的ID直接与Team的ID匹配,导致无法正确筛选出用户所属Team的Job。以下是修正方案:
错误原因
原代码中$q->where('id', auth()->user()->worker_id)是把Worker表的ID当作Team表的ID来查询,而实际上Worker是归属到某个Team的,需要通过Worker找到对应的Team,再关联Job。
修正方案(两种实现方式)
方式一:先获取用户所属Team的ID,再筛选Job
这种方式更直观,适合关联关系明确的场景:
// 从当前登录用户关联的Worker中获取Team ID $teamId = auth()->user()->worker->team_id; $jobs = Job::with(['teams', 'clients']) ->whereHas('teams', function ($q) use ($teamId) { // 筛选关联了该Team的Job $q->where('id', $teamId); }) ->orderBy('id', 'DESC') ->paginate($paginate); return JobResource::collection($jobs);
方式二:嵌套关联查询(无需提前获取Team ID)
如果需要更紧凑的链式查询,可以使用多层whereHas,但需要先给Team模型补充Worker关联:
- 先在Team模型中添加Worker关联:
public function workers() { return $this->hasMany(Worker::class); }
- 然后修改JobController的查询逻辑:
$jobs = Job::with(['teams', 'clients']) ->whereHas('teams.workers', function ($q) { // 筛选出关联了当前用户对应Worker的Team的Job $q->where('id', auth()->user()->worker_id); }) ->orderBy('id', 'DESC') ->paginate($paginate); return JobResource::collection($jobs);
注意事项
- 确保Worker表中存在
team_id字段,关联Team表的id(因为你的Worker模型定义了hasOne(Team::class),默认外键是team_id)。 - 确保User模型中已经定义了与Worker的关联:
// User模型中添加 public function worker() { return $this->belongsTo(Worker::class); }
这样才能通过auth()->user()->worker获取到对应的Worker记录。
内容的提问来源于stack exchange,提问作者Maison012
相关产品推荐
相关产品推荐

