私は、今後 7 日間に繰り返し/更新される予定のものだけを cron で取得して、リマインダー メールを送信するようにしていますProjects
。私のロジックがうまく機能していないことがわかりました。
現在、次のような質問があります:
$projects = Project::where(function($q){
$q->where('recur_at', '>', date("Y-m-d H:i:s", time() - 604800));
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
しかし、私がする必要があるのは次のことだと気づきました:
疑似SQL:
SELECT * FROM projects WHERE recur_at > recur_at - '7 days' AND /* Other status + recurr_cancelled stuff) */
Laravel 4 でこれをどのように実行し、DATETIME データ型を使用するにはどうすればよいでしょうか。私はタイムスタンプを使用してこの種のことだけを実行しました。
アップデート:
次のコードを使用した後、この問題を解決できました。Stackoverflow は、コードの一部を抜き出してコンテキストから切り離して確認できる場合にも役立ちます。
$projects = Project::where(function($q){
$q->where(DB::raw('recur_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()'));
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
更新された質問:Laravel/Eloquent でこれを行うより良い方法はありますか?
アップデート2:
最初の解決策は、さらにテストを行った結果、正しくなかったため、次の解決策を解決してテストしました。
$projects = Project::where(function($q){
$q->where('recur_at', '<=', Carbon::now()->addWeek());
$q->where('recur_at', '!=', "0000-00-00 00:00:00");
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
ベストアンサー1
where
を使わずに、直接 を連鎖させることもできますfunction(q)
。また、Laravelには日付を扱う便利なパッケージがあります。炭素. 次のようなことができます:
$projects = Project::where('recur_at', '>', Carbon::now())
->where('recur_at', '<', Carbon::now()->addWeek())
->where('status', '<', 5)
->where('recur_cancelled', '=', 0)
->get();
Composer で Carbon が必要であり、Carbon 名前空間 (use Carbon\Carbon;) を使用していることを確認すれば、動作するはずです。
編集:ジョエルは言った、次のようにすることができます:
$projects = Project::whereBetween('recur_at', array(Carbon::now(), Carbon::now()->addWeek()))
->where('status', '<', 5)
->where('recur_cancelled', '=', 0)
->get();