Laravel 5.4 красноречиво hasMany и последующий PHP для проверки статуса утверждения

У меня две модели: 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) {

            }
        }
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
158
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вы можете упростить свой запрос так:

$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: Не тестировал как следует, но все должно работать.

Спасибо! Это прекрасно работает. Я знал, что есть красноречивый способ сделать это, и это правильно.

Matt Larson 18.05.2018 19:19

Есть ли у вас рекомендуемый способ обновления, чтобы получать все электронные письма, независимо от их типа review_group_type и независимо от того, есть ли у них emailReviews и по-прежнему можно установить статус утверждения? В этом случае я бы хотел установить статус либо на approved, либо на pending approval.

Matt Larson 18.05.2018 19:24

Что-то в этом роде: $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; });

Matt Larson 18.05.2018 19:28

На самом деле неважно, именно это работает отлично! Еще раз спасибо :)

Matt Larson 18.05.2018 19:30

Другие вопросы по теме