用于筛选已收到电子邮件的用户的SQL查询

时间:2014-08-26 12:07:17

标签: sql email select laravel-4 filter

假设:

  1. 您尝试发送群发邮件,但出现了问题,只有部分用户收到了邮件。
  2. 您最近发送了一封群发邮件,但现在新用户已注册,他们也需要收到邮件。
  3. 如何过滤那些已经收到新闻的人(通过Eloquent查询或数据库中的select命令。)

    实际上我在基于Laravel 4的项目中遇到了这个问题,我在数据透视表上使用Laravel Eloquent搜索查询,并跟踪发送给用户的电子邮件。

    在我的情况下,有两个模型:帖子和用户

    它有多对多关系:任何用户都可以收到很多帖子,任何帖子都可以发送给很多用户

2 个答案:

答案 0 :(得分:1)

您需要在users表格中添加一列,例如名为datetime的{​​{1}}字段。然后在您的电子邮件或注册方法(无论您发送第一封电子邮件的哪个位置)更新用户,并通过电子邮件发送mailed_at

从那时起,您可以根据datetime查询仍需要电子邮件的用户。


要检查需要简报的多个用户,请假设您的用户表架构如下(保持简单):

mailed_at

我们在此处检查用户是否通过基于mailed_at列的查询收到了电子邮件。要获得需要接收邮件的所有用户,您需要执行以下操作:

id  |  email  |  password  |  mailed_at (nullable)

答案 1 :(得分:0)

有两种型号:发布用户

它有多对多关系:任何用户都可以收到很多帖子,任何帖子都可以发送给很多用户

我将其实现如下:

class Post extends Eloquent {

    public function recipients() 
    {
        return $this->belongsToMany('User', 'posts_users', 'post_id', 'user_id');
    }
}

class User extends Eloquent {

    public function mails() 
    {
        return $this->belongsToMany('Post', 'posts_users', 'user_id', 'post_id');
    }
}

所以,当我想向用户发送帖子时我会使用

$usersToMail = User::whereNotExists(function($query) use ($post_id)
               {
                    $query->select(DB::raw(1))
                          ->from('posts_users')
                          ->whereRaw('posts_users.user_id = users.id')
                          ->whereRaw('posts_users.post_id = '.$post_id);
               })->get();

foreach ($usersToMail as $user)
{
    // send email
    $user->mails()->save($post); // it records that this post has been sent to the user
}