Eloquent查询修正:需判断所有审批者是否均已审批邮件
问题分析
你的代码逻辑存在一个关键问题:在foreach循环中,只要最后一条满足approver_status === true的评审记录是approved === true,就会把approvalStatus设为true——但如果前面有一条有审批权限的评审者没通过,循环到后面时这个值会被覆盖成true,这完全不符合你「所有审批者都通过才为true」的需求。
修正方案
我们可以利用Laravel集合的方法来更精准地实现这个逻辑:先过滤出所有拥有审批权限的评审记录,再检查这些记录是否全部完成了审批通过。如果没有任何审批权限的评审者,你可以根据业务需求设置默认值(下面代码默认设为true,你可以按需调整)。
$emailsWithReviews = Email::with('emailReviews') ->where(['created_by' => $personID, 'sent_at' => null]) ->get() ->map(function ($email) { // 筛选出所有具备审批权限的评审记录 $approverReviews = $email->emailReviews->where('approver_status', true); // 处理无审批者的边界情况 if ($approverReviews->isEmpty()) { $email->approvalStatus = true; return $email; } // 检查所有审批者是否都已通过审批 $allApproved = $approverReviews->every(function ($review) { return $review->approved === true; }); $email->approvalStatus = $allApproved; return $email; });
代码说明
where('approver_status', true):从所有评审记录中精准筛选出拥有审批权限的用户,排除仅能提供反馈的角色。isEmpty():处理没有审批者的特殊场景,避免后续判断出现逻辑漏洞。every()方法:集合的every会遍历所有元素,只有当每一个元素都满足回调条件时才返回true,完美匹配你「所有审批者都通过才生效」的业务逻辑。
这样修改后,就彻底解决了原代码只看最新一条评审记录的问题,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Matt Larsuma
相关产品推荐
相关产品推荐

