2017-07-26 17 views
0

私は、保存された検索用語に従ってユーザーに電子メールを送信するコマンドを持っています。今のところ私はこのている:電子メールを送信した後にテーブル行を更新する(Laravelコマンド)

public function handle() 
{ 
    $user = Alert::select('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(); 
    } 
} 

ここで私は、ユーザごとに送信した日付と時間を節約することができますどのように二つの質問...

  1. がありますか?私はそれがコードに示されているようにそれをしようとしています。 $u->emailSentAt = Carbon::now();$u->save();ですが、何も更新しません... emailSentAtはNULLのままです。
  2. 私のデータベースにはintervalという列があります($userで選択されています)。間隔の値は、1または2、毎日または毎週アラートです(それぞれ)。どのように私はそれがユーザーの間隔の好みに応じて実行するようにコマンドを作ることができますか?それが毎日の場合、私は電子メールが毎日送信されるようにしたい...
+2

'$ u'はUserオブジェクトではありません。 foreachループ内でユーザーオブジェクトを読み込んで修正してみてください。 – aynber

+0

あなたは何を言っているのか分かりません...それはユーザーとは関係ありません。アラートタイプのオブジェクトです。 :/ ...更新が必要な列はアラートテーブルにあります。 – harunB10

+0

試した '$ u-> update(['emailSentAt' => Carbon \ Carbon :: now()]);'? – linktoahref

答えて

0

はあなたの最初の質問については

$date = new DateTime(); 
$u->emailSentAt = $date->format('Y-m-d H:i:s'); 
+0

それは働いていません:( – harunB10

1

PHPを使用して、この使用laravel

use Carbon\Carbon; 
$u->emailSentAt = Carbon::now()->toDayDateTimeString(); //date 
$u->emailSentAt = Carbon::now()->timestamp; // timestamp 

を試してみてください、私はあなたに2を提案代替:

  • 選択には、Alertプライマリキーを追加します。それが機能すれば、再度保存してください。
  • Alert::find($id)を実行して保存して、動作しているかどうかを確認してください。

    • は、次の2つのコマンド、毎日実行されます1及び別の毎週を持つことができ、各コマンドは、コマンドに関連する間隔を選択したユーザーのみが取得されます:あなたの2番目の質問に

    、例えばDailyEmailCommandはinterval = 1のクエリのみを実行し、WeeklyEmailCommandはinterval = 2のクエリのみを実行します。

  • 毎日実行されるすべてのユーザーに対してクエリを実行し、interval = 1を選択したユーザーに電子メールを送信し、if Carbonを使用した週末です。その条件が成立した場合は、interval = 2を選択したユーザーに電子メールを送信してください。
+0

Ok。最初の解決策は完璧です!私は2番目の今試してみます。どのような問題は、プライマリIDと関連付けることができますか? – harunB10

+0

申し訳ありませんが、それは私の間違いでした、私はちょうどどちらかがあなたに最も合っているかを見るためにそれらの2つの解決策を提案しました –

+0

それは私の間違いです。私はあなたが言っていることを理解しています。私の表現は間違っていた。それは "私は今すぐ第二の問題を解決しようとする"べきである。 :D – harunB10

関連する問題