php - Eloquent 地查询与审阅者的电子邮件,其中所有审阅者都有 approval_status 已批准电子邮件

标签 php mysql laravel eloquent

此查询非常接近,但它根据最近的评论将 approvalStatus 设置为 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 会处理这个问题,但如果最近的是 $review->approver_status == 1 && $review->approved == 1,它肯定会返回 true。

最佳答案

认为这可能会奏效,您已经接近 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()
    ...

关于php - Eloquent 地查询与审阅者的电子邮件,其中所有审阅者都有 approval_status 已批准电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50646579/

相关文章:

mysql - 提高查询性能以仅更新 1 列而不是 3 列

mysql - 从两个不同日期之间的mysql查询获取最大和最小小时

php - Macroable.php 中的 BadMethodCallException 第 81 行 :Method update does not exist

php - 路由 : Too few arguments to function 1 passed 2 expected 上的 Laravel 策略

php - 是否需要检查每个 Controller 页面中的登录功能

php - 从 MySQL 返回一个 boolean 值以在函数中用作参数

php - 删除自引用的@ManyToMany 连接

mysql - 如何在 MySQL 中进行正则表达式替换?

php - Laravel 5.3 记住我身份验证问题

php - Voicexml: <record> 提交截断音频消息