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
相关产品推荐
相关产品推荐

