Eloquent查询优化:过滤非审批者判断邮件审批状态
解决邮件审批状态计算的问题
我来帮你搞定这个问题!你的核心痛点是当前逻辑没有区分有审批权限和仅反馈的审核者,导致非审批者的approved值干扰了最终的审批状态判断,同时部分场景下还出现了approvalStatus未赋值的情况。下面是针对性的解决方案:
问题根源分析
原代码中$reviewsStatus = $email->emailReviews->pluck('approved')->unique();会把所有审核记录的结果都纳入判断,包括那些没有审批权限的用户。哪怕所有审批者都通过了,只要有一个无权限用户的approved是false,就会让最终的approvalStatus变成false,这显然不符合业务逻辑。
修改后的代码实现
我们需要先过滤出具备审批权限的审核记录,再基于这些有效记录判断审批状态,同时确保所有场景下都能给approvalStatus赋值:
$data = Email::with('emailReviews') ->where(['created_by' => $personID, 'sent_at' => null]) ->get() ->map(function ($email) { // 第一步:筛选出仅具备审批权限的审核记录 $authorizedReviews = $email->emailReviews->where('approver_status', true); // 处理边界情况:如果没有任何有效审批者(根据业务需求调整逻辑) if ($authorizedReviews->isEmpty()) { $email->approvalStatus = false; return $email; } // 第二步:检查所有有效审批是否全部通过 $email->approvalStatus = $authorizedReviews->pluck('approved')->every(function ($status) { return $status === true; }); return $email; });
代码逻辑说明
- 过滤有效审批者:使用
where('approver_status', true)排除仅能提供反馈的无权限用户,只保留真正能决定审批结果的记录; - 处理边界场景:如果邮件的审核记录里没有任何具备审批权限的用户,直接设置
approvalStatus为false(你可以根据实际业务需求调整,比如设为null或者其他自定义状态); - 判断全通过状态:用
every()方法检查所有有效审批的approved是否都是true,只要有一个审批者未通过,结果就为false,完全符合审批逻辑; - 避免未赋值情况:无论哪种分支,都会给
approvalStatus赋值,解决了你提到的部分场景下该字段缺失的问题。
性能优化建议(可选)
如果邮件和审核记录的数据量较大,可以把过滤逻辑提前到数据库查询阶段,减少内存中加载的无效数据:
$data = Email::with(['emailReviews' => function ($query) { // 预加载时直接过滤出有审批权限的记录 $query->where('approver_status', true); }]) ->where(['created_by' => $personID, 'sent_at' => null]) ->get() ->map(function ($email) { if ($email->emailReviews->isEmpty()) { $email->approvalStatus = false; return $email; } $email->approvalStatus = $email->emailReviews->pluck('approved')->every(fn($status) => $status === true); return $email; });
这样能减少Eloquent模型实例的数量,提升查询和处理的性能。
内容的提问来源于stack exchange,提问作者Matt Larsuma
相关产品推荐
相关产品推荐

