I думаю, это может сработать, вы почти у цели с 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()
...