用于检查已批准每封电子邮件的批准者的电子邮件集合上的集合的雄辩查询具有approval_status

时间:2018-05-29 17:41:47

标签: php mysql laravel eloquent

我真的很接近这一点,但它并没有完全捕捉到所有场景。有一组电子邮件。他们每个人都可以有多个评论(肯定至少有一个)。审核将具有approver_status属性(此审核附带的审核者可以批准或拒绝)和approved属性(无论是否实际批准发送)。一些评论者不是"批准者"并且只能提供反馈。我雄辩的查询如下:

 $data = Email::with('emailReviews')
                 ->where(['created_by' => $personID, 'sent_at' => null])
                 ->get()
                 ->map(function ($email) {
                     $reviewsStatus = $email->emailReviews->pluck('approved')->unique();
                     if ($reviewsStatus->count() == 1 && $reviewsStatus->first()) {
                         $email->approvalStatus = true;
                     } else {
                         $email->approvalStatus = false;
                     }

                     return $email;
                 });

如果所有评论者都是"批准者"它会有效,但如果有批评者和非批准者进行一些评论,即使所有"批准者"已经批准了。在map函数中,如果审阅者没有approved,我需要忽略approver_status属性。我想知道我是否可以添加一些内容:

$reviewsStatus = $email->emailReviews->pluck('approved')->unique();

基本上充当where子句where approver_status === false。我知道我不能这样做,但这就是我的想法。我还试过在那里添加if语句:

$data = Email::with('emailReviews')
                 ->where(['created_by' => $personID, 'sent_at' => null])
                 ->get()
                 ->map(function ($email) {
                     $approverStatus = $email->emailReviews->pluck('approver_status')->unique();
                     if ($approverStatus->count() == 1 && $approverStatus->first()) {
                         $reviewsStatus = $email->emailReviews->pluck('approved')->unique();
                         if ($reviewsStatus->count() == 1 && $reviewsStatus->first()) {
                             $email->approvalStatus = true;
                         } else {
                             $email->approvalStatus = false;
                         }
                     }

                     return $email;
                 });

对于具有更复杂审核方案的电子邮件,这不会返回$email->approvalStatus。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以过滤批准和approver_status都设置为true的emailReviews,然后如果至少有一次计数,则将approvalStatus设置为true。

$data = Email::with('emailReviews')
    ->where(['created_by' => $personId, 'sent_at' => null])
    ->get()
    ->map(function ($email) {
        $email->approvalStatus = $email->emailReviews->where('approved', true)
            ->where('approver_status', true)
            ->count() > 0;

        return $email;
    });