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

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;
    });

代码逻辑说明

  1. 过滤有效审批者:使用where('approver_status', true)排除仅能提供反馈的无权限用户,只保留真正能决定审批结果的记录;
  2. 处理边界场景:如果邮件的审核记录里没有任何具备审批权限的用户,直接设置approvalStatus为false(你可以根据实际业务需求调整,比如设为null或者其他自定义状态);
  3. 判断全通过状态:用every()方法检查所有有效审批的approved是否都是true,只要有一个审批者未通过,结果就为false,完全符合审批逻辑;
  4. 避免未赋值情况:无论哪种分支,都会给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:10