web-dev-qa-db-fra.com

Laravel $ q-> où () entre les dates

J'essaie de faire en sorte que mon cron reçoive uniquement Projects qui doit se reproduire/se renouveler dans les 7 prochains jours pour envoyer des courriels de rappel. Je viens de découvrir que ma logique ne fonctionne pas tout à fait.

J'ai actuellement la requête:

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

Cependant, je me suis rendu compte que je devais faire quelque chose comme:

Psudo SQL:

SELECT * FROM projects WHERE recur_at > recur_at - '7 days' AND /* Other status + recurr_cancelled stuff) */

Comment ferais-je ceci dans Laravel 4, et en utilisant le type de données DATETIME, je n’ai fait que ce genre de chose en utilisant des horodatages.

Mise à jour:

Stackoverflow est parvenu à résoudre ce problème après avoir utilisé le code suivant. Stackoverflow vous aide également lorsque vous pouvez extraire des fragments de code et les regarder hors contexte.

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

Question mise à jour: Existe-t-il une meilleure façon de procéder à Laravel/Eloquent?

Mise à jour 2:

La première résolution n’a pas eu lieu juste après d’autres tests, j’ai maintenant résolu et testé la solution suivante:

$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

Vous pouvez chaîner votre wheres directement, sans function(q). Il existe également un package de traitement des dates Nice dans laravel, appelé Carbon . Pour que vous puissiez faire quelque chose comme:

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

Assurez-vous simplement que vous avez besoin de Carbon dans composer et que vous utilisez un espace de noms Carbon (utilisez Carbon\Carbon;) et cela devrait fonctionner.

EDIT: Comme Joel a dit , vous pourriez faire:

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

Je ne voulais pas jouer avec le carbone. Alors voici ma solution

$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: au lieu d'utiliser 'maintenant' ou 'addWeek' si nous fournissons la date au format suivant, cela ne donne pas les enregistrements corrects

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

il donne les enregistrements dont la date du 2015-10-16 est inférieure à 2015-10-23. Si la valeur de recur_at est 2015-10-23 00:00: alors seulement cela montre cet enregistrement sinon s'il est 2015-10-23 12: 00:45 alors il n'est pas montré.

3
Jaykumar Patil