Laravel $ q- & gt; where () zwischen Daten

Ich bin versucht, meine cron nur get Projects aufgrund von Rezidiven/erneuern in den nächsten 7 Tagen zu versenden Erinnerungs-E-Mails. Ich habe gerade herausgefunden meine Logik funktioniert nicht ganz.

Momentan habe ich die Abfrage:

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

Jedoch merkte ich, was ich tun müssen, ist so etwas wie:

Psudo SQL:

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

Wie würde ich das in Laravel 4, und mit den DATETIME-Datentyp ist, habe ich nur getan, diese Art der Sache mithilfe von Zeitstempeln.

Update:

Geschafft, dies zu lösen, nach der Verwendung den folgenden code, Stackoverflow hilft auch, wenn Sie können, ziehen Sie bits von code und schauen Sie aus dem Zusammenhang gerissen.

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

Aktualisiert Frage: gibt es eine bessere Möglichkeit, dies zu tun in Laravel/Eloquent?

Update 2:

Die erste Auflösung, die am Ende nicht Recht, nach weiteren Tests, habe ich jetzt behoben und getestet mit der folgenden Lösung:

$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);
});
Kommentar zu dem Problem
Soweit ich weiß, Sie verwenden Sie DB::raw also Nein, es gibt keinen anderen Weg, dies zu tun mit Eloquent auf seine eigenen. Auf der anderen Seite, wie Sie kommen, wenn Sie eine DATETIME anstelle von TIMESTAMP-Spalte? Was ich verlange ist unabhängig zu der ursprünglichen Frage, aber TIMESTAMP passt besser in vielen Fällen im Vergleich zu DATETIME. Kommentarautor: N.B.
@N. B. DATETIME scheint die "standard" - Zeit-Feld, das Laravel verwendet, so hielt ich mit ihm. Kommentarautor: Jono20201
Statt wo(DB::raw(sql)), die Sie verwenden können, whereRaw(sql) Kommentarautor: Needpoule
@MrShibby ich denke, ich mag die Art von der where(DB::raw()) - format, wie es scheint ein wenig klarer. Gibt es irgendeinen technischen Grund, warum Sie die whereRaw() ist besser? Kommentarautor: Jono20201
@Jono20201 - Nein, es ist nicht die standard-Uhrzeit-Feld. Standard-Uhrzeit-Feld ist, und immer wird eine TIMESTAMP. Der Grund dafür ist, dass der ZEITSTEMPEL immer in UTC, wo mit DATETIME und man sollte wissen, welche Zeitzone Sie kam, so dass Sie durchführen können, Zeit-Konvertierung für einen Benutzer in einer anderen Zeit zone. Auch Eloquent verwendet die timestamp-Typ und nicht datetime. Beide Arten zeigen Sie die exakt gleichen Datum formatiert, so würde ich dringend raten, Sie zu verwenden, timestamp anstelle von datetime. Kommentarautor: N.B.

InformationsquelleAutor der Frage Jono20201 | 2014-07-18

Schreibe einen Kommentar