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);
});
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. where(DB::raw())
- format, wie es scheint ein wenig klarer. Gibt es irgendeinen technischen Grund, warum Sie die whereRaw()
ist besser? 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 der Frage Jono20201 | 2014-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die Kette Ihrer
where
s direkt, ohnefunction(q)
. Es gibt auch ein nettes date handling-Paket in laravel, genannt Carbon. So könnte man etwas machen wie:Nur sicherstellen, dass Sie benötigen, Carbon, Komponist und Sie sind mit Carbon-namespace (use Carbon\Carbon;) und es sollte funktionieren.
BEARBEITEN:
Als Joel sagte, die man tun könnte:
InformationsquelleAutor der Antwort Tom
Nicht wan, um Durcheinander mit carbon. Also hier ist meine Lösung
InformationsquelleAutor der Antwort Edmund Sulzanok
@Tom : Anstelle der Verwendung von 'jetzt' oder 'addWeek', wenn wir das Datum in folgender Form enthalten, die es nicht geben richtigen Datensätze
gibt es Datensätze mit Datum form 2015-10-16 auf weniger als 2015-10-23.
Wenn der Wert recur_at ist 2015-10-23 00:00:00 dann nur es zeigt, dass Rekord
sonst, wenn es 2015-10-23 12:00:45 dann es wird nicht angezeigt.
InformationsquelleAutor der Antwort Jaykumar Patil
Bearbeitet: bitte beachten Sie, dass
whereBetween('date',$start_date,$end_date)
inklusive dem ersten date.
InformationsquelleAutor der Antwort Edwin M