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

Laravel Eloquent条件查询:筛选未分配给指定客户的医生

解决Laravel中获取未被指定客户分配医生的问题

我来帮你搞定这个问题!你的需求是获取完全没有被指定客户分配过的医生,而当前的scopeOnlyAvailable逻辑刚好偏离了目标——它找的是存在其他客户记录的医生,哪怕这个医生已经被目标客户分配过(比如ID为5的医生,他有客户1的记录,但因为还有客户2、3的记录,还是会被返回),这显然不符合你的预期。

修正后的范围方法

最直接的解决方案是使用Laravel提供的whereDoesntHave方法,它专门用来筛选不存在满足条件的关联记录的模型:

public function scopeOnlyAvailable($query, $customerId = 1) {
    return $query->whereDoesntHave('participations', function($query) use ($customerId) {
        $query->where('customer_id', $customerId);
    });
}

为什么原方法不对?

原代码里的whereHas('participations', ...)的逻辑是:只要医生存在至少一条不是目标客户的参与记录,就会被选中。这意味着哪怕医生已经和目标客户有过关联,只要他还有其他客户的记录,就会被返回,完全不符合“未被指定客户分配”的要求。

而whereDoesntHave刚好相反:它会筛选出没有任何一条关联记录匹配目标客户ID的医生,完美契合你的需求。

另一种实现方式:左连接查询

如果你更喜欢用原生SQL风格的左连接,也可以这样写:

public function scopeOnlyAvailable($query, $customerId = 1) {
    return $query->leftJoin('participations', function($join) use ($customerId) {
        $join->on('doctors.id', '=', 'participations.doctor_id')
             ->where('participations.customer_id', $customerId);
    })
    ->whereNull('participations.id')
    ->select('doctors.*');
}

这个逻辑是:将医生表和目标客户的参与记录左连接,然后筛选出连接后参与记录ID为null的医生——也就是没有和目标客户建立过任何关联的医生。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:48:11