Laravel $q->wo() zwischen den Terminen

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);
});
Soweit ich weiß, Sie zu verwenden 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.
DATETIME scheint die "standard" - Zeit-Feld, das Laravel verwendet, so hielt ich mit ihm.
Statt wo(DB::raw(sql)), die Sie verwenden können, whereRaw(sql)
Ich denke, ich mag die Art von der where(DB::raw()) - format, wie es scheint ein wenig klarer. Gibt es irgendeinen technischen Grund, warum whereRaw() ist besser?
Nein, es ist nicht die standard-Uhrzeit-Feld. Standard-Uhrzeit-Feld ist, und immer sein wird, ein 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.

InformationsquelleAutor Jono20201 | 2014-07-18

Schreibe einen Kommentar