Я пытаюсь заставить мой cron получать только Projects
, которые должны быть возвращены / продлены в течение следующих 7 дней, чтобы отправить электронные письма с напоминанием. Я только что узнал, что моя логика не совсем работает.
У меня есть запрос:
$projects = Project::where(function($q){ $q->where('recur_at', '>', date("Ymd H:i:s", time() - 604800)); $q->where('status', '<', 5); $q->where('recur_cancelled', '=', 0); });
Однако я понял, что мне нужно сделать, это что-то вроде:
Psudo 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); });
Вы можете напрямую связать свое место, без function(q)
. Там также хороший пакет обработки даты в laravel, называемый Carbon . Таким образом, вы можете сделать что-то вроде:
$projects = Project::where('recur_at', '>', Carbon::now()) ->where('recur_at', '<', Carbon::now()->addWeek()) ->where('status', '<', 5) ->where('recur_cancelled', '=', 0) ->get();
Просто убедитесь, что вам нужен Carbon в композиторе, и вы используете пространство имен Carbon (используйте Carbon \ Carbon;), и он должен работать.
EDIT: Как сказал Джоэл , вы могли бы сделать:
$projects = Project::whereBetween('recur_at', array(Carbon::now(), Carbon::now()->addWeek())) ->where('status', '<', 5) ->where('recur_cancelled', '=', 0) ->get();
Не хотелось путаться с углеродом. Итак, вот мое решение
$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: вместо использования «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, если это 2015-10-23 12:00:45, тогда она не отображается .
Отредактировано: Пожалуйста, обратите внимание, что
whereBetween('date',$start_date,$end_date)
включает первую дату.