2016-07-28 7 views
0

laravelを初めて使用しています。データベースからのLaravelスケジューラcronのオプション

私はスケジュールをどのように実行することができますか。 スケジュールパラメータ(頻度、コマンド)は、mysqlテーブルに格納されます。

解決策は次のとおりです。 file_put_contentsを使用してapp/Console/Kernelに書き込みます。

これ以上のアイデアを歓迎します。予め

おかげで、 クリス・パパス

答えて

2

特定のコマンドの周波数は、複数のレベルで定義されています。サーバー上のCron entryは毎分スケジュールを呼び出します。あなたのスケジューラにはfrequency optionsもあります。

データベースに格納されているPARAMATERSは、コマンド実行の頻度を定義してみましょうする可能性の一つは、テーブルとMySQLのテーブル内のスケジュールパラメータを検証local scopeあなたのコマンドをモデルにexecuted_atフィールドを追加することです。

public function scopeReadyToExecute($query) 
{ 
    return $query->where('executed_at', '<=', Carbon::now()->subMinutes(5)->toDateTimeString()); 
} 

この例では、頻度は5分です。もちろん、頻度フィールドの値に応じてこの値を変更する必要があります。

さて、あなたは例えばマスターを定義することができます。マスターのハンドルで

$schedule->command('master:command')->everyMinute() 

:Kernel.phpでのコマンドは毎分実行するコマンドあなたは準備ができているコマンドを取得するために、スコープの関数を呼び出します

テーブルに定義されたパラメータに従って実行可能な各コマンドが実行されます。

幸運を祈る!

1

ここで私の解決策です。

アプリ将来の誰かを助ける/コンソール/ Kernel.php

$report_schedules = ReportSchedule::all(); 
    foreach ($report_schedules as $report_schedule) { 

     $method_name = (string)$report_schedule->report->method_name; 
     $schedule->call(function() use ($method_name, $report_schedule) { 
      $emailSchedules = new EmailSchedules(); 
      $email_List=array_unique(array_merge($report_schedule->users()->get()->lists("email")->toArray(), $report_schedule->groups()->with(["users"=>function ($query){$query->select("email");}])->get()->toArray())); 
      $users=\App\User::whereIn("email",$email_List)->get(["first_name","last_name","email"]); 
      $users_to=[]; 
      $emails_to=[]; 
      foreach($users as $user){ 
       array_push($users_to,$user->first_name." ".$user->last_name); 
       array_push($emails_to,$user->email); 
      } 

      $emailSchedules->$method_name($emails_to,$users_to); 
     })->cron($report_schedule->frequency)->name('mail')->timezone("Europe/Athens"); 
    } 

希望。

関連する問題