我爲用戶提供了電子郵件警報功能。無論他們想每天還是每週都收到警報,他們都可以激活。 在警報表我有列:UID(用戶ID),間隔,SEARCHTERM,emailSentAt等..Laravel - 基於數據庫的間隔運行任務
所以,我有這樣的命令:
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('[email protected]', '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給他發送電子郵件,並且我想每週發送一次。
我認爲你必須在這個問題上錯誤的做法。 你爲什麼不''每天'運行計劃命令,但做檢查發送電子郵件在命令本身。 您可能需要一個額外的字段,比如「last_sent_date」或其他內容,所以您可以計算(輕鬆使用Carbon)知道您上次發送郵件後的多少天。 – alexr