2017-10-06 2 views
0

Ich habe E-Mail-Alarm-Funktion für Benutzer. Sie können aktivieren, ob sie Warnungen täglich oder wöchentlich erhalten möchten. In Benachrichtigungen Tabelle I Spalten: uid (Benutzer-ID), Intervall, search, emailSentAt, etc ...Laravel - Aufgabe in Intervall basierend auf Datenbank

So habe ich diesen Befehl ein:

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(); 
     } 
    } 

Hier habe ich E-Mails senden und die gesendete Zeit sparen in emailSentAt Spalte.

Und in Kernel.php

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

Für interval Spalte in der Datenbank habe ich zwei Werte: 0 (täglich) und 1 (wöchentlich).

Wie kann ich diesen Befehl basierend auf Intervall Spalte ausführen? Wenn der Benutzer 0 hat, möchte ich ihm jeden Tag um 13:00 Uhr eine E-Mail senden, und 1 möchte ich wöchentlich senden.

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

Und dann in handle() i dieses füge hinzu:

+0

Ich glaube, Sie haben einen falschen Ansatz zu diesem Thema. Warum führen Sie nicht täglich den Befehl "schedule" aus, sondern führen Sie die Überprüfungen durch, um die E-Mail im Befehl selbst zu senden. Sie benötigen wahrscheinlich ein zusätzliches Feld wie "last_sent_date" oder so, damit Sie (einfach mit Carbon) berechnen können, wie viele Tage seit dem letzten Versand vergangen sind. – alexr

Antwort

0

würde ich eine neue Aufgabe, um den Zeitplan wie folgt hinzufügen

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

Und dann verwenden wöchentlich die Abfrage $ filtern . Auf diese Weise können Sie wählen, wann Sie die täglichen und wöchentlichen E-Mails versenden möchten.

Edit: Sorry, hinzufügen/Sie dies auch Befehl ändern, es weist den Befehl, dass das wöchentliche Argument ist optional:

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

Ich bekomme diese '[Symfony \ Component \ Console \ Exception \ InvalidArgumentException] Das" wöchentliche "Argument existiert nicht. ' – harunB10

+0

Es gibt ein Beispiel für wöchentliche Befehle in der Dokumentation: https://laravel.com/docs/5.4/scheduling#schedule-frequency-options – alexr

+0

Hm, tut mir leid, aber ich verstehe nicht, wie kann ich wählen, welcher Befehl geht zu versenden. Wenn ich "php artisan email: user 1" habe, wie kann ich versichern, dass dies wöchentlich gesendet wird? – harunB10

Verwandte Themen