У меня две модели: Email и EmailReview. Электронная почта имеет много отзывов по электронной почте. Этот запрос:
$data = Email::with('emailReviews')->where('created_by', '=', $personId)->get();
возвращает коллекцию emails конкретного человека, у которых есть review_group_type из approval или feedback, и отношения email_reviews, которые имеют утвержденное свойство true, false или null. Я ищу самый чистый способ проверить, является ли электронное письмо подтверждением, и все отзывы в коллекции имеют утвержденный столбец со значением true, чтобы установить статус утверждения для каждого электронного письма, то есть $email->approvalStatus. На некоторые электронные письма также не будет отзывов, поэтому мне нужно это проверить. Что-то в этом роде, но это явно становится уродливым, и мне трудно получить конечный результат:
if ($data->review_group_type === 'approval') {
foreach($data as $email) {
if (!is_null($email->email_reviews))
foreach($email->email_reviews as $review) {
}
}
}






Я думаю, вы можете упростить свой запрос так:
$data = Email::with('emailReviews')
->where(['created_by'=>$personId,'review_group_type'=>'approval'])
->has('emailReviews')->get();
Здесь вы получите все электронные письма, созданные конкретным человеком, с условием утверждения и отзывы по электронной почте.
Опираясь на ответ @ Salama96 и идя немного дальше, вы можете сделать это:
$data = Email::with('emailReviews')
->where(['created_by'=>$personId,'review_group_type'=>'approval'])
->has('emailReviews')
->get()
->map(function ($email){
// Here, you check if all the emailReviews are 'true'
$reviewsStatus = $email->emailReviews->pluck('approved')->unique();
if ($reviewsStatus->count() == 1 AND $reviewsStatus->first())
{
$email->approvalStatus = true;
}
return $email;
});
}
PS: Не тестировал как следует, но все должно работать.
Есть ли у вас рекомендуемый способ обновления, чтобы получать все электронные письма, независимо от их типа review_group_type и независимо от того, есть ли у них emailReviews и по-прежнему можно установить статус утверждения? В этом случае я бы хотел установить статус либо на approved, либо на pending approval.
Что-то в этом роде: $data = Email::with('emailReviews') ->where('created_by', '=', $personId) ->get() ->map(function ($email) { $reviewsStatus = $email->emailReviews->pluck('approved')->unique(); if ($reviewsStatus->count() == 1 and $reviewsStatus->first()) { $email->approvalStatus = 'Approved'; } else { $email->approvalStatus = 'Pending Approval'; } return $email; });
На самом деле неважно, именно это работает отлично! Еще раз спасибо :)
Спасибо! Это прекрасно работает. Я знал, что есть красноречивый способ сделать это, и это правильно.