Laravel $q - > where () między datami

Staram się, aby mój cron otrzymywał tylko Projects, które mają być powtarzane/odnawiane w ciągu najbliższych 7 dni, aby wysyłać e-maile z przypomnieniami. Właśnie się dowiedziałem, że moja logika nie działa.

Aktualnie mam zapytanie:

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

Jednak zdałem sobie sprawę, że to, co muszę zrobić, to coś w stylu:

Psudo SQL:

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

Jak miałbym to zrobić w Laravel 4, A używając datatetime datatype, robiłem tylko tego typu rzeczy używając znaczników czasu.

Update:

Udało się to rozwiązać po użyciu poniższego kodu, Stackoverflow pomaga również, gdy można wyciągnąć fragmenty kodu i spojrzeć na nie z kontekstu.

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

Zaktualizowane pytanie: czy jest lepszy sposób, aby to zrobić w Laravel / Eloquent?

Aktualizacja 2:

Pierwsza rozdzielczość skończyła się nie od razu po dalszych testach, teraz rozwiązałem i przetestowałem następujące rozwiązanie:

$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);
});
Author: Jono20201, 2014-07-18

4 answers

Możesz łańcuchować swoje where bezpośrednio, bez function(q). W laravel jest też pakiet do obsługi randek, zwany Carbon. Więc możesz zrobić coś w stylu:

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

Upewnij się tylko, że w composerze potrzebujesz carbonu i używasz przestrzeni nazw Carbon (użyj Carbon\Carbon;) i powinno działać.

Edytuj: Jak powiedział Joel, możesz zrobić:

$projects = Project::whereBetween('recur_at', array(Carbon::now(), Carbon::now()->addWeek()))
    ->where('status', '<', 5)
    ->where('recur_cancelled', '=', 0)
    ->get();
 57
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:20

Nie chciałem zadzierać z węglem. Więc oto moje rozwiązanie

$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
Author: Edmund Sulzanok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-02 13:01:56

@Tom: zamiast używać ' now ' lub 'addWeek' jeśli podamy datę w następującym formacie, nie podaje poprawnych zapisów

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

Podaje rekordy z datą od 2015-10-16 do mniej niż 2015-10-23. Jeśli wartość recur_at jest 2015-10-23 00:00:00 wtedy tylko pokazuje , że zapis else if it is 2015-10-23 12:00:45 Następnie nie jest pokazywany .

 3
Author: Jaykumar Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-27 09:27:35

Edited: Uprzejmie informujemy, że
whereBetween('date',$start_date,$end_date)
obejmuje pierwszą randkę.

 -1
Author: Edwin M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 20:05:19