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

Laravel如何筛选所有关联模型满足指定值的主模型?

在Laravel中实现筛选所有关联模型均满足特定条件的主模型

要实现你需要的scopeIsFinished作用域,核心思路是反向排除不符合条件的关联模型——直接筛选出不存在任何OPEN或IN_PROGRESS状态Job的用户,这样剩下的用户自然所有Job状态都是CLOSED或SCHEDULED。完全不需要额外定义关联,用whereDoesntHave就能简洁实现:

// 在App\Models\User模型中添加以下作用域方法
use App\Models\Job;
use App\Enums\JobStatus;

public function scopeIsFinished($query)
{
    return $query->whereDoesntHave('jobs', function ($jobQuery) {
        $jobQuery->whereIn('status', [JobStatus::OPEN, JobStatus::IN_PROGRESS]);
    });
}

逻辑说明

  • whereDoesntHas('jobs', ...)会查询所有没有匹配闭包条件的关联Job的用户
  • 闭包内的whereIn指定了需要排除的Job状态:只要用户有任何一个Job是OPEN或IN_PROGRESS,就会被排除在外
  • 最终返回的用户集合,所有关联的Job状态必然都是CLOSED或SCHEDULED

使用方式

直接在查询链中调用该作用域即可:

$finishedUsers = User::isFinished()->get();

内容的提问来源于stack exchange,提问作者S_R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:27:05