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

