此查询非常接近,但它根据最近的评论将 approvalStatus
设置为 true,而我想检查所有评论,并且仅当所有评论都带有 approver_status
设置为 true 已批准电子邮件。一封邮件可以有很多评论,有的评论者是批准者,有的只能反馈,不能批准/拒绝。这是当前查询:
$emailsWithReviews = Email::with('emailReviews')
->where(['created_by' => $personID, 'sent_at' => null])
->get()
->map(function ($email) {
foreach ($email->emailReviews as $review) {
if ($review->approver_status === true && $review->approved === false) {
return $email->approvalStatus = false;
}
$email->approvalStatus = true;
}
return $email;
});
我原以为 foreach 会处理这个问题,但如果最近的是 $review->approver_status == 1 && $review->approved == 1
,它肯定会返回 true。
最佳答案
我认为这可能会奏效,您已经接近 foreach,但不要使用 foreach,请尝试使用 filter()
返回任何有效的评论被拒绝了,看看最后的集合是否为空。
例如,如果您有 2 条来自有效评论者的评论,一条接受,一条拒绝,找到所有被拒绝的评论,并返回是否找到任何评论。
Email::with('emailReviews')
->where(['created_by' => $personID, 'sent_at' => null])
->get()
->filter(function ($email) {
return $email->emailReviews->filter(function ($review) {
return $review->approver_status == 1
&& $review->approved == 0;
})->isEmpty();
})
->each(function ($email) {
$email->approvalStatus = true;
// Optionally:
$email->save();
});
或者如果您担心性能:
$ids = Email::with('emailReviews')
->where(['created_by' => $personID, 'sent_at' => null])
->get()
->filter(function ($email) {
return $email->emailReviews->filter(function ($review) {
return $review->approver_status == 1
&& $review->approved == 0;
})->isEmpty();
})->pluck('id');
Email::whereIn('id', $ids)->update([
'approvalStatus' => 1,
]);
我也很想将 where 条件提取到范围中以使其更易于阅读:
Email::with('emailReviews')
->whereAuthor($personID)
->whereNotSent()
...
关于php - Eloquent 地查询与审阅者的电子邮件,其中所有审阅者都有 approval_status 已批准电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50646579/