web-dev-qa-db-ja.com

Laravel $ q-> where()日付の間

通知メールを送信するために、今後7日間に更新/更新されるProjectsのみを取得するようにcronを取得しようとしています。私のロジックがうまく機能しないことがわかりました。

私は現在クエリを持っています:

$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は、次のコードを使用した後にこれを解決することができました。また、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);
});
41
Jono20201

function(q)なしで、wheresを直接チェーンできます。 laravelには、 Carbon と呼ばれる素敵な日付処理パッケージもあります。そのため、次のようなことができます。

$projects = Project::where('recur_at', '>', Carbon::now())
    ->where('recur_at', '<', Carbon::now()->addWeek())
    ->where('status', '<', 5)
    ->where('recur_cancelled', '=', 0)
    ->get();

composerにCarbonが必要であることと、Carbon名前空間を使用していること(Carbon\Carbonを使用)を確認してください。

編集: ジョエルが言った のように、あなたは次のことができます:

$projects = Project::whereBetween('recur_at', array(Carbon::now(), Carbon::now()->addWeek()))
    ->where('status', '<', 5)
    ->where('recur_cancelled', '=', 0)
    ->get();
58
Tom

炭素をめちゃくちゃにしたくありませんでした。だからここに私の解決策があります

$start = new \DateTime('now');
$start->modify('first day of this month');
$end = new \DateTime('now');
$end->modify('last day of this month');

$new_releases = Game::whereBetween('release', array($start, $end))->get();
12
Edmund Sulzanok

@Tom:次の形式で日付を提供する場合、「now」または「addWeek」を使用する代わりに、正しいレコードを提供しません

$projects = Project::whereBetween('recur_at', array(new DateTime('2015-10-16'), new DateTime('2015-10-23')))
->where('status', '<', 5)
->where('recur_cancelled', '=', 0)
->get();

2015-10-16から2015-10-23未満の日付形式のレコードを提供します。 recur_atの値が2015-10-23 00:00:00の場合、のみが表示されますelse if2015-10-23 12:00:45thenit表示されません

3
Jaykumar Patil