2017-10-06 5 views
0

ユーザーの電子メール警告機能があります。毎日または毎週アラートを取得するかどうかをアクティブにすることができます。アラートテーブルで は、私は列があります。ここで私は電子メールを送信し、送信され、時間を節約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(); 
     } 
    } 

:UID(ユーザーID)、間隔、SEARCHTERM、emailSentAt、等...だから

を、私は、このコマンドを持っていますemailSentAt欄に記載されています。 0(毎日)と1(週次):

とデータベース内のinterval列については

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

Kernel.php

私は2つの値を持っています。

インターバル列に基づいてこのコマンドを実行するにはどうすればよいですか?ユーザーが0の場合は毎日13:00にメールを送信したい、1回は週に1回送信したい。

+0

私はあなたがこの問題に関する間違ったアプローチを持っていると思います。 スケジュールコマンドを「毎日」実行するのではなく、コマンド自体で電子メールを送信するためのチェックを行うのはなぜですか? 「last_sent_date」などのように、これに余分なフィールドが必要なことがあるので、最後にメールを送信してから何日経っているかを計算することができます。 – 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]を受け取ります 「weekly」引数は存在しません。 ' – harunB10

+0

docsには毎週のコマンドの例があります:https://laravel.com/docs/5.4/scheduling#schedule-frequency-options – alexr

+0

申し訳ありませんが、どういうコマンドが選択されているのか分かりません送信されます。私が 'php artisan email:user 1'を持っていれば、これが毎週送信されることをどうすれば保証できますか? – harunB10

関連する問題