Laravel - 基于数据库

时间:2017-10-06 09:01:33

标签: php laravel

我为用户提供电子邮件提醒功能。他们可以激活他们是否希望每天或每周收到警报。 在警报表中我有列:uid(userID),interval,searchTerm,emailSentAt等......

所以,我有这个命令:

public function handle()
    {

        $user = Alert::select('alerts.id', 'search', 'email', 'interval', 'emailSentAt')->join('users', 'alerts.uid', '=', 'users.id')->whereNotNull('search')->distinct()->get();

        foreach ($user as $u) {
            $cl      = new SphinxSearch();
            $results = $cl->search('@*' . $u->search, 'spots');
            $results = $cl->limit(10);
            $results = $cl->setMatchMode(\Sphinx\SphinxClient::SPH_MATCH_EXTENDED);
            $results = $cl->setSortMode(\Sphinx\SphinxClient::SPH_SORT_ATTR_DESC, "start");
            $results = $cl->get();

            Mail::send('emails.newSearchAlert', ['u' => $u, 'results' => $results], function ($m) use ($u) {

                $m->from('noreply@mydomain.tv', 'My Company');

                $m->to($u->email)->subject('Your search alert - ' . $u->search);
            });

            $u->emailSentAt = Carbon::now();
            $u->save();
        }
    }

在这里,我发送电子邮件并将发送时间保存在emailSentAt列中。

在Kernel.php中

protected function schedule(Schedule $schedule)
    {
        $schedule->command('email:user')->dailyAt('13:00');
    }

对于数据库中的interval列,我有两个值:0(每天)和1(每周)。

如何根据间隔列运行此命令?如果用户有0,我想每天13:00给他发电子邮件,1我想每周发送一次。

1 个答案:

答案 0 :(得分:0)

我会在计划中添加一个新任务,如下所示:

$schedule->command('email:user', ['weekly'=> true])->weekly('15:00');

然后在handle()中我会添加:

$weekly = $this->argument('weekly');

然后使用$ weekly来过滤查询。这样您就可以选择何时发送每日和每周邮件。

编辑:抱歉,同时添加/更改此命令,它告诉命令每周参数是可选的:

protected $signature = 'email:user {weekly?}';