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

Этот запрос очень близок, но он устанавливает approvalStatus в значение true, основываясь на самом последнем обзоре, тогда как я хочу проверить все отзывы и установить статус в значение 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 позаботится об этом, но он определенно возвращает true, если самый последний из них - $review->approver_status == 1 && $review->approved == 1.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Хорошо, я думаю, что проблема заключалась в том, что я был прикован цепью ко многим заявлениям.Я решил это, разбив его:

$emailsWithReviews = Email::with('emailReviews')
            ->whereNull('sent_at')
            ->get();

    $emailsWithReviews->filter(function ($email) {
            return $email->emailReviews->filter(function ($review) {
                return $review->approver_status == 1
                    && $review->approved == 0;
            })->isEmpty();
        })
        ->each(function ($email) {
            $email->approvalStatus = true;
        });
0 голосов
/ 01 июня 2018

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()
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...