实际上,我需要在一段时间内向所有用户发送提醒电子邮件。所以基本上如果用户在过去3天内没有发表任何评论,我需要向他发送电子邮件。
我正在使用表结构:
用户
评论
我使用了愚蠢的查询
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比较日期,如果还有条件,但我不想以这种方式接近。
有没有办法通过雄辩的方式实现这一点。
答案 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)
您可以合并whereHas
和whereDoesntHave
,还可以转换查询,按照关系满足的条件过滤用户
$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上测试的。*