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);
});
Vous pouvez chaîner votre where
s 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();
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();
@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é.