You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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关联:

  1. 先在Team模型中添加Worker关联:
public function workers()
{
    return $this->hasMany(Worker::class);
}
  1. 然后修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:31:16