Красноречивый запрос, который проверяет коллекцию в коллекции электронных писем для утверждающих, которые одобрили каждое электронное письмо, когда не у всех есть Approval_status - PullRequest
0 голосов
/ 29 мая 2018

Я действительно близок к этому, но это не совсем ловит все сценарии.Там есть коллекция писем.Каждый из них может иметь несколько обзоров (наверняка хотя бы один).Рецензия будет иметь свойство 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;
                 });

Он работает, если все рецензенты являются «утверждающими», но если есть какие-то отзывы с утверждающими и не утверждающими, он отправляет обратно false, даже если все «утверждающие»"одобрили это.В функции карты мне нужно игнорировать свойство 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 голосов
/ 29 мая 2018

Вы можете отфильтровать emailReviews, в которых для утвержденного и Approver_status установлено значение true, а затем для параметра 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;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...