2017-10-06 52 views
0

我爲用戶提供了電子郵件警報功能。無論他們想每天還是每週都收到警報,他們都可以激活。 在警報表我有列: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給他發送電子郵件,並且我想每週發送一次。

+0

我認爲你必須在這個問題上錯誤的做法。 你爲什麼不''每天'運行計劃命令,但做檢查發送電子郵件在命令本身。 您可能需要一個額外的字段,比如「last_sent_date」或其他內容,所以您可以計算(輕鬆使用Carbon)知道您上次發送郵件後的多少天。 – alexr

回答

0

我想補充一個新的任務,日程安排是這樣的:

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

然後在手柄()我想補充一點:

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

然後用$每週過濾查詢。這樣您可以選擇何時發送每日郵件和每週郵件。

編輯:對不起,加元/本,以及改變你命令,它告訴命令每週的參數是可選的:

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

我得到這個'[Symfony \ Component \ Console \ Exception \ InvalidArgumentException] 「每週」參數不存在。 ' – harunB10

+0

在文檔中有一個每週命令的示例:https://laravel.com/docs/5.4/scheduling#schedule-frequency-options – alexr

+0

嗯,抱歉,但我不明白我該如何選擇要執行的命令將被寄出。如果我有'php手工電子郵件:用戶1',我怎麼能保證這將每週發送? – harunB10

相關問題