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

Laravel中如何筛选存在Pending状态用户的关联课程?

解决多对多关联中获取含Pending用户的课程问题

嘿,我来帮你搞定这个问题~ 你之前的两种方法之所以返回全部课程,是因为你只在关联关系里过滤了用户,但并没有对课程本身做筛选——哪怕某个课程没有任何Pending状态的用户,它还是会被返回,只是对应的关联用户集合是空的而已。

下面给你两种正确的实现方式,都是直接过滤出至少有一个Pending用户的课程:

方法一:使用whereHas(推荐,Laravel风格)

首先保持Course模型里的关联关系简洁,不需要在关联里加条件:

public function users()
{
    return $this->belongsToMany(User::class)->withPivot('section');
}

然后查询的时候,用whereHas来判断课程是否存在符合条件的关联用户:

$pendingCourses = Course::whereHas('users', function ($query) {
    $query->wherePivot('section', 'Pending');
})->get();

whereHas的作用就是:只返回那些存在满足闭包条件的关联记录的课程,完美匹配你的需求。

方法二:直接关联中间表查询

如果你习惯用原生SQL风格的join,也可以直接关联course_user中间表来筛选:

$pendingCourses = Course::join('course_user', 'courses.id', '=', 'course_user.course_id')
    ->where('course_user.section', 'Pending')
    ->distinct() // 去重,避免同一课程因多个Pending用户重复出现
    ->select('courses.*') // 只返回课程表的字段
    ->get();

这里一定要加distinct,因为同一个课程可能有多个用户处于Pending状态,join后会生成多条重复的课程记录,去重后就能得到唯一的课程列表了。

再补一句为啥之前的方法不行

你之前在关联里加wherePivot,比如pendingUsers关联,当你调用Course::with('pendingUsers')->get()时,返回的是所有课程,只是每个课程的pendingUsers集合只包含符合条件的用户——没有Pending用户的课程,它的pendingUsers是空的,但课程本身还是会出现在结果里,这就不是你想要的啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:07:17