获取在eloquent前3天发布最后评论的用户

时间:2017-10-05 08:05:29

标签: php mysql laravel eloquent

实际上,我需要在一段时间内向所有用户发送提醒电子邮件。所以基本上如果用户在过去3天内没有发表任何评论,我需要向他发送电子邮件。

我正在使用表结构:

用户

  • ID
  • 用户名
  • 电子邮件
  • 退订

评论

  • ID
  • USER_ID
  • 评论
  • created_at

我使用了愚蠢的查询

Comment::with(['user' => function ($q) {
        $q->where('unsubscribed', 0)->select('id', 'username', 'email');
    }])
->groupBy('user_id')
->whereDate('created_at', $thereDaysAgoDate)
->get(['user_id']);

这给了我在该特定日期发表评论的所有用户。

我的问题是I only want the users who have posted a comment on that particular date but then not posted any comment after that date

我可以通过从comment表中获取所有用户,然后通过PHP比较日期,如果还有条件,但我不想以这种方式接近。

有没有办法通过雄辩的方式实现这一点。

2 个答案:

答案 0 :(得分:1)

  $main_query =  Comment::with(['user' => function ($q) {
                $q->where('unsubscribed', 0)->select('id', 'username', 'email');
            }])
        ->groupBy('user_id');     

  $all_users = $main_query->whereDate('created_at', $thereDaysAgoDate)
        ->get(['user_id']);

  $users_who_have_posts_after = $main_query->
        ->whereDate('created_at','>', $thereDaysAgoDate)
        ->get(['user_id']);

  $users_without_post_after = $all_users->whereNotIn('user_id',$users_who_has_posts_after);

也许它不是最好的方式,但它只做2个查询和一个循环。 我正在获取在所需日期发布的所有用户,然后获取仍在我们日期之后发布的用户,然后将原始用户池与仍处于活动状态的用户进行比较。

答案 1 :(得分:1)

您可以合并whereHaswhereDoesntHave,还可以转换查询,按照关系满足的条件过滤用户

    $the_date = '2017-09-29';
    User::where('unsubscribed', 0)->whereHas('comments', function ($comments)  use ($the_date){
        return $comments->whereDate('created_at', '=', $the_date);
    })->whereDoesntHave('comments',  function($comments) use ($the_date){
        return $comments->whereDate('created_at', '>', $the_date);
    })->get();
  

PS:我认为你与用户有comments的关系。这是在L5.5上测试的。*